home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir44 / dungeon9.zip / DUNGEON.BAS < prev    next >
BASIC Source File  |  1994-05-15  |  166KB  |  4,723 lines

  1. Rem The Dungeon 9.0 Main Program
  2.  
  3. ' declare all variables as integer
  4. Defint A-Z
  5.  
  6. ' declares variable storage for dungeon record structure type
  7. Type dungeontype
  8.  dat(1 To 24,1 To 80) as integer
  9.  scrn(1 To 24,1 To 80) as integer
  10.  stats(1 To 32) as integer
  11. End Type
  12.  
  13. ' declares variable storage for user record structure type
  14. Type usertype
  15.  codename as string*32
  16.  password as string*32
  17.  spell(1 to 40) as integer
  18.  wand(1 to 10) as integer
  19.  potion(1 to 10) as integer
  20.  staff(1 to 10) as integer
  21.  ring(1 to 10) as integer
  22.  globe(1 to 10) as integer
  23.  stats1(1 to 6) as double
  24.  stats2(1 to 17) as integer
  25. End Type
  26.  
  27. ' standard error routine
  28. On Error Goto Error.Routine
  29.  
  30. ' declare structures and arrays common to main program
  31. Dim userrec as usertype
  32. Dim dungeonrec as dungeontype
  33. Dim w(30,20) as Integer
  34. Dim v(30,20) as Integer
  35. Dim monsters(8,6) as Double
  36. Dim monstername(101) as String
  37.  
  38. ' define function to convert 20 character string to encrypted string
  39. Def fnencrypt$(z$)
  40.  i$=""
  41.  For i=1 To 4
  42.    j#=0
  43.    j$=Mid$(z$,i*5-4,5)
  44.    For q=1 To 5
  45.      j#=j#*1000+Asc(Mid$(j$,q,1))
  46.    Next
  47.    i$=i$+Mkd$(j#)
  48.  Next
  49.  fnencrypt$=i$
  50. End Def
  51.  
  52. ' define function to convert encrypted string to 20 character string
  53. Def fndecrypt$(z$)
  54.   i$=""
  55.   For j=1 To 4
  56.     j$=""
  57.     z#=Cvd(Mid$(z$,j*8-7,8))
  58.     For q=1 To 5
  59.       dvid#=Int(z#/1000)
  60.       num#=z#-dvid#*1000
  61.       z#=dvid#
  62.       j$=j$+Chr$(num#)
  63.     Next
  64.     y$=Left$(j$,1)
  65.     Mid$(j$,1,1)=Mid$(j$,5,1)
  66.     Mid$(j$,5,1)=y$
  67.     y$=Mid$(j$,2,1)
  68.     Mid$(j$,2,1)=Mid$(j$,4,1)
  69.     Mid$(j$,4,1)=y$
  70.     i$=i$+j$
  71.   Next
  72.   fndecrypt$=i$
  73. End Def
  74.  
  75. Key Off ' disable function keys
  76. Screen 0 ' reset to default text screen
  77. Randomize Timer ' seed random number generator
  78. f$="ANSI.EXE" ' display welcome screen
  79. If Dir$(f$)=f$ Then ' determine if program exists
  80.   Shell f$ ' call program
  81.   Color 15,1 ' ansi color
  82.   Locate 24,3 ' locate message
  83.   Print "Press <enter> to continue to The Dungeon, or press <space> to exit to Dos:";
  84.   Do ' input loop
  85.     I$=Inkey$ ' get input
  86.     While I$="" ' wait for input
  87.       I$=Inkey$ ' get input
  88.     Wend ' end wait
  89.     Select Case I$ ' choose input
  90.     Case " " ' space
  91.       Color 7,0 ' reset ansi
  92.       Cls ' clear screen
  93.       End ' end program
  94.     Case Chr$(13) ' return pressed
  95.       Exit Do ' exit input loop
  96.     End Select ' end choose input
  97.   Loop ' end input loop
  98. Endif ' end ansi shell
  99. Gosub Open.User.File ' open the users data file
  100. Restore Monster.Data ' read names of monsters from data
  101. For i=1 To 101 ' 100 monsters plus 1 demon
  102.   Read monstername(i) ' load data into monster name array
  103. Next ' end load loop
  104. Do ' main program loop
  105.   ' user presses enter to play,
  106.   ' or another key to exit program.
  107.   Color 14, 1 ' blue background
  108.   Cls ' clear screen
  109.   Locate 10,27,0 ' locate for message
  110.   Color 14 ' yellow color
  111.   Print Chr$(201); ' print ascii character
  112.   Print String$(25,Chr$(205)); ' print ascii character
  113.   Print Chr$(187); ' print ascii character
  114.   Locate 11,27,0 ' position cursor
  115.   Print Chr$(186); ' print ascii character
  116.   Color 15 ' ansi color
  117.   Print " Welcome to the ";
  118.   Color 28 ' ansi color
  119.   Print "Dungeon! ";
  120.   Color 14 ' ansi color
  121.   Print Chr$(186); ' print ascii character
  122.   Locate 12,27,0 ' position cursor
  123.   Print Chr$(186); ' print ascii character
  124.   Color 15 ' ansi color
  125.   Print " Hit ";
  126.   Color 10 ' ansi color
  127.   Print "<enter>";
  128.   Color 15 ' ansi color
  129.   Print " to play or  ";
  130.   Color 14 ' ansi color
  131.   Print Chr$(186); ' print ascii character
  132.   Locate 13,27,0 ' position cursor
  133.   Print Chr$(186); ' print ascii character
  134.   Color 15 ' ansi color
  135.   Print " any other key to quit.. ";
  136.   Color 14 ' ansi color
  137.   Print Chr$(186); ' print ascii character
  138.   Locate 14,27,0 ' position cursor
  139.   Print Chr$(200); ' print ascii character
  140.   Print String$(25,Chr$(205)); ' print ascii character
  141.   Print Chr$(188); ' print ascii character
  142.   Locate 15,33,0 ' position cursor
  143.   Color 15 ' ansi color
  144.   Print "Turn on Numlock";
  145.   Color 7 ' ansi color
  146.   x$="" ' get keystroke
  147.   While x$="" ' wait for input
  148.     x$=Inkey$ ' get keystroke
  149.   Wend ' end wait
  150.   If x$<>Chr$(13) Then
  151.     Exit Do
  152.   Endif
  153.   For i=1 To 8 ' clear monster array
  154.     For j=1 To 6 ' of all statistics
  155.       monsters(i,j)=0 ' set to zero
  156.     Next ' end clear loop
  157.   Next ' end clear loop
  158.   Do ' loop to get user codename into code$ and password into pass$
  159.     Color 14, 1 ' blue background
  160.     Cls ' clear screen
  161.     Locate 11,25,0 ' locate for message
  162.     Color 14 ' yellow color
  163.     Print "Before you enter the ";
  164.     Color 13 ' ansi color
  165.     Print "Dungeon,";
  166.     Locate 12,25,0 ' position cursor
  167.     Color 14 ' ansi color
  168.     Print "you must inscibe your name in";
  169.     Locate 13,25,0 ' position cursor
  170.     Print "   the book of adventurers.";
  171.     Color 10 ' ansi color
  172.     Locate 15,28,0 ' position cursor
  173.     Print Chr$(201); ' print ascii character
  174.     Print String$(20,Chr$(205)); ' print ascii character
  175.     Print Chr$(187); ' print ascii character
  176.     Locate 16,49,0 ' position cursor
  177.     Print Chr$(186); ' block character
  178.     Locate 17,49,0 ' position cursor
  179.     Print Chr$(188); ' block character
  180.     For i=48 To 29 Step -1
  181.       Locate 17,i,0 ' position cursor
  182.       Print Chr$(205); ' block character
  183.     Next
  184.     Locate 17,28,0 ' position cursor
  185.     Print Chr$(200); ' block character
  186.     Locate 16,28,0 ' position cursor
  187.     Print Chr$(186); ' block character
  188.     Locate 16,29,1 ' position cursor
  189.     Color 15 ' ansi color
  190.     ' loop to retrieve code$ character by character.
  191.     '   backspace, enter, and characters A to Z are accepted,
  192.     '   otherwise a beep, or beep for backspace before column one,
  193.     '   or beep for enter with no characters input. Maximum 20 characters.
  194.     code$="" ' clear code$
  195.     Do
  196.       x$="" ' get keystroke
  197.       While x$="" ' wait for input
  198.         x$=Inkey$ ' get keystroke
  199.       Wend ' end wait
  200.       Select Case x$
  201.       Case Chr$(13)' enter key
  202.         If Len(code$) Then
  203.           Exit Do ' exit loop
  204.         Endif
  205.         Beep ' warning signal
  206.       Case Chr$(8) ' backspace
  207.         If Len(code$)=0 Then
  208.           Beep ' warning signal
  209.         Else
  210.           Locate 16,Pos(0)-1,1 ' position cursor
  211.           Print " ";
  212.           Locate 16,Pos(0)-1,1 ' position cursor
  213.           code$=Left$(code$,Len(code$)-1) ' truncate input string one character
  214.         Endif
  215.       Case "a" To "z", "A" To "Z", " " ' check valid character
  216.         If Len(code$)=20 Then ' verify length of string
  217.           Beep ' warning signal
  218.         Else
  219.           code$=code$+x$ ' append to code$
  220.           Print x$;
  221.         Endif
  222.       End Select
  223.     Loop
  224.     Locate 19,25,0 ' position cursor
  225.     Print "Now inscribe your secret name.";
  226.     Color 10 ' ansi color
  227.     Locate 21,28,0 ' position cursor
  228.     Print Chr$(201); ' print ascii character
  229.     Print String$(20,Chr$(205)); ' print ascii character
  230.     Print Chr$(187); ' print ascii character
  231.     Locate 22,49,0 ' position cursor
  232.     Print Chr$(186); ' block character
  233.     Locate 23,49,0 ' position cursor
  234.     Print Chr$(188); ' block character
  235.     For i=48 To 29 Step -1
  236.       Locate 23,i,0 ' position cursor
  237.       Print Chr$(205); ' block character
  238.     Next
  239.     Locate 23,28,0 ' position cursor
  240.     Print Chr$(200); ' block character
  241.     Locate 22,28,0 ' position cursor
  242.     Print Chr$(186); ' block character
  243.     Locate 22,29,1 ' position cursor
  244.     Color 15 ' ansi color
  245.     ' loop to retrieve pass$ character by character.
  246.     '   backspace, enter, and characters A to Z are accepted,
  247.     '   otherwise a beep, or beep for backspace before column one,
  248.     '   or beep for enter with no characters input. Maximum 20 characters.
  249.     pass$="" ' clear pass$
  250.     Do
  251.       x$="" ' get keystroke
  252.       While x$="" ' wait for input
  253.         x$=Inkey$ ' get keystroke
  254.       Wend ' end wait
  255.       Select Case x$
  256.       Case Chr$(13) ' enter key
  257.         If Len(pass$) Then
  258.           Color 7 ' ansi color
  259.           Exit Do ' exit loop
  260.         Endif
  261.         Beep ' warning signal
  262.       Case Chr$(8) ' backspace
  263.         If Len(pass$)=0 Then
  264.           Beep ' warning signal
  265.         Else
  266.           Locate 22,Pos(0)-1,1 ' position cursor
  267.           Print " ";
  268.           Locate 22,Pos(0)-1,1 ' position cursor
  269.           pass$=Left$(pass$,Len(pass$)-1) ' truncate input string one character
  270.         Endif
  271.       Case "a" To "z", "A" To "Z", " " ' check valid character
  272.         If Len(pass$)=20 Then ' verify length of string
  273.           Beep ' warning signal
  274.         Else
  275.           pass$=pass$+x$ ' append to pass$
  276.           Print ".";
  277.         Endif
  278.       End Select
  279.     Loop
  280.     code$=code$+String$(20-Len(code$),32) ' pad with spaces to the right
  281.     code$=Lcase$(code$) ' convert codename to lowercase
  282.     pass$=pass$+String$(20-Len(pass$),32) ' pad with spaces to the right
  283.     pass$=Lcase$(pass$) ' convert password to lowercase
  284.     ' find existing codename in users data file, or new user
  285.     login=0
  286.     new.user=-1
  287.     ' get each users data file record one by one
  288.     For ux=1 To Lof(1)/Len(userrec)
  289.       ' get the data file record
  290.       Get 1,ux,userrec
  291.       ' get the decrypted codename
  292.       xcrypt$=fndecrypt$(userrec.codename)
  293.       ' check for an existing codename
  294.       If code$=xcrypt$ Then
  295.         ' get the decrypted password
  296.         ycrypt$=fndecrypt$(userrec.password)
  297.         ' if existing users password does not match,
  298.         '   set flag for no login.
  299.         If pass$=ycrypt$ Then
  300.           login=-1
  301.         Endif
  302.         ' not a new user if codename found
  303.         new.user=0
  304.         Exit For ' exit the loop after finding and checking password
  305.       Endif
  306.     Next
  307.     ' the codename was not found.. a new user.
  308.     If new.user Then
  309.       ' reset all variables for new user
  310.       dlvl#=1
  311.       userrec.stats1(1)=1
  312.       userrec.stats1(2)=1
  313.       userrec.stats1(3)=64
  314.       userrec.stats1(4)=15
  315.       userrec.stats1(5)=0
  316.       userrec.stats1(6)=15
  317.       For i=1 To 12
  318.         userrec.stats2(i)=0
  319.       Next
  320.       For i=13 To 16
  321.         userrec.stats2(i)=10
  322.       Next
  323.       userrec.stats2(17)=0
  324.       For i=1 To 10
  325.         userrec.wand(i)=0
  326.         userrec.potion(i)=0
  327.         userrec.staff(i)=0
  328.         userrec.ring(i)=0
  329.         userrec.globe(i)=0
  330.       Next
  331.       For i=1 To 40
  332.         userrec.spell(i)=0
  333.       Next
  334.       Color 14, 1 ' blue background
  335.       Cls ' get the new users statistics
  336.       Locate 11,28,0 ' position cursor
  337.       Color 12 ' ansi color
  338.       Print "Str Int Wis Con Dex Cha"; ' display statistic header
  339.       Locate 13,15,0 ' position cursor
  340.       Color 13 ' ansi color
  341.       Print "Rolling Character Stats(5 to keep or 9 to ignore)";
  342.       ' loop to randomly select 6 statistics,
  343.       '   and exit loop after user presses enter
  344.       Do
  345.         Locate 12,29,0 ' position cursor
  346.         Color 10 ' ansi color
  347.         For x=1 To 6
  348.           m=Int(Rnd*9+10)
  349.           userrec.stats2(x)=m ' random statistic
  350.           Print Right$(Str$(m),2)+"  ";
  351.         Next
  352.         Do ' get a keystroke
  353.           Gosub Get.Keystroke
  354.         Loop Until x=5 Or x=9
  355.         ' exit statistics loop when enter/5 is pressed
  356.         If x=5 Then
  357.           Locate 15,11,0 ' position cursor
  358.           Color 15 ' ansi color
  359.           Print "Press 0 for help when playing, and Q to quit. Now hit a key.";
  360.           Color 7 ' ansi color
  361.           Gosub Get.Key.Press ' get a single keystroke
  362.           Gosub Put.User.File ' store users record to data file
  363.           login=-1 ' set logged in variable
  364.           Exit Do
  365.         Endif
  366.       Loop
  367.     Endif
  368.     ' if user has logged in (by rolling new character statistics, or
  369.     ' by matching password to existing codename)..
  370.     If login Then
  371.       Gosub Open.Data.File ' open the users data file
  372.       Get 1,ux,userrec ' ux is the user index to the data file
  373.       Gosub Change.Level ' ask user to select level to start on
  374.       Do ' main input loop
  375.         Gosub Status.Line ' display statistics on line 24
  376.         x$="" ' get keystroke
  377.         While x$="" ' wait for input
  378.           x$=Inkey$ ' get keystroke
  379.         Wend ' end wait
  380.         ' determine key pressed
  381.         Select Case Len(x$)
  382.         Case 1
  383.           Select Case x$
  384.           Case "1" ' attack nearby monsters
  385.             Gosub Attack.Nearby.Monsters
  386.             Gosub Monster.Attack
  387.             Gosub Encounter.Cells
  388.           Case "2" ' move player down
  389.             Gosub Move.Player.Down
  390.           Case "3" ' get user to enter a spell chant to cast
  391.             Gosub Cast.Chant
  392.           Case "4" ' move player left
  393.             Gosub Move.Player.Left
  394.           Case "5", Chr$(13) ' enter key/null action/update hits
  395.             Gosub Update.Hits
  396.           Case "6" ' move player right
  397.             Gosub Move.Player.Right
  398.           Case "7" ' move player away from nearby monster
  399.             Gosub Evade.Monster
  400.           Case "8" ' move player up
  401.             Gosub Move.Player.Up
  402.           Case "9" ' ignore key/null action/update hits
  403.             Gosub Update.Hits
  404.           Case "0" ' help screen menu
  405.             Gosub Display.Help
  406.           Case "+" ' display dungeon information
  407.             Gosub Display.Info
  408.           Case "." ' display extended status line 25
  409.             Gosub Extended.Status.Line
  410.           Case "-" ' learned spells display screen
  411.             Gosub Learned.Spells
  412.           Case "\" ' statistic trading menu
  413.             Gosub Trade.Stats
  414.           Case ";" ' inventory purchasing menu
  415.             Gosub Buy.Inventory
  416.           Case "=" ' reselect dungeon level number
  417.             Gosub Store.Dungeon.Level ' store dungeon screen
  418.             Gosub Change.Level
  419.           Case "/" ' inventory display screen
  420.             Gosub Inventory
  421.           Case "'" ' use magic item menu
  422.             Gosub Use.Item
  423.             Gosub Cell.Action ' compute nearby cells
  424.           Case "`" ' user list
  425.             Gosub User.List
  426.           Case "Q", "q" ' quit the dungeon
  427.             Gosub Store.Dungeon.Level ' store dungeon screen
  428.             Gosub Put.User.File
  429.             dlvl#=0 ' dungeon level zero/exit flag
  430.             login=0 ' set logged in variable false
  431.           Case Chr$(1) to Chr$(10)
  432.             i=Asc(x$) ' use a staff number 1 to 10
  433.             Gosub Use.Staff
  434.           Case Chr$(17) to Chr$(26)
  435.             i=Asc(x$)-16 ' use a ring number 1 to 10
  436.             Gosub Use.Ring
  437.           Case Else
  438.             Color 13 ' ansi color
  439.             a$="Type 0 for help, or Q to quit.." ' make display message
  440.             Gosub Display.Message ' output message
  441.           End Select
  442.         Case 2
  443.           sp=Asc(Mid$(x$,2))
  444.           spn=0
  445.           Select Case sp
  446.           ' use a wand extended keys 1 to 10
  447.           Case 30
  448.             i=1
  449.             Gosub Use.Wand
  450.           Case 48
  451.             i=2
  452.             Gosub Use.Wand
  453.           Case 46
  454.             i=3
  455.             Gosub Use.Wand
  456.           Case 32
  457.             i=4
  458.             Gosub Use.Wand
  459.           Case 18
  460.             i=5
  461.             Gosub Use.Wand
  462.           Case 33
  463.             i=6
  464.             Gosub Use.Wand
  465.           Case 34
  466.             i=7
  467.             Gosub Use.Wand
  468.           Case 35
  469.             i=8
  470.             Gosub Use.Wand
  471.           Case 23
  472.             i=9
  473.             Gosub Use.Wand
  474.           Case 36
  475.             i=10
  476.             Gosub Use.Wand
  477.           ' use a potion extended keys 1 to 10
  478.           Case 16
  479.             i=1
  480.             Gosub Use.Potion
  481.           Case 19
  482.             i=2
  483.             Gosub Use.Potion
  484.           Case 31
  485.             i=3
  486.             Gosub Use.Potion
  487.           Case 20
  488.             i=4
  489.             Gosub Use.Potion
  490.           Case 22
  491.             i=5
  492.             Gosub Use.Potion
  493.           Case 47
  494.             i=6
  495.             Gosub Use.Potion
  496.           Case 17
  497.             i=7
  498.             Gosub Use.Potion
  499.           Case 45
  500.             i=8
  501.             Gosub Use.Potion
  502.           Case 21
  503.             i=9
  504.             Gosub Use.Potion
  505.           Case 44
  506.             i=10
  507.             Gosub Use.Potion
  508.           ' F1 to F10, cast spell type 1
  509.           Case 59 To 68
  510.             spn=1
  511.             sp=sp-58
  512.             Gosub Cast.Spell.Type1
  513.           ' Control-F1 to F10, cast spell type 2
  514.           Case 94 To 103
  515.             spn=2
  516.             sp=sp-93
  517.             Gosub Cast.Spell.Type2
  518.           ' Shift-F1 to F10, cast spell type 3
  519.           Case 84 To 93
  520.             spn=3
  521.             sp=sp-83
  522.             Gosub Cast.Spell.Type3
  523.           ' Alt-F1 to F10, cast spell type 4
  524.           Case 104 To 113
  525.             spn=4
  526.             sp=sp-103
  527.             Gosub Cast.Spell.Type4
  528.           ' extended keys equal to numeric keypad entry
  529.           Case 79 ' 1, attack nearby monsters
  530.             Gosub Attack.Nearby.Monsters
  531.             Gosub Monster.Attack
  532.             Gosub Encounter.Cells
  533.           Case 80 ' 2, move player down
  534.             Gosub Move.Player.Down
  535.           Case 81 ' 3, cast spell
  536.             Gosub Cast.Chant
  537.           Case 75 ' 4, move player left
  538.             Gosub Move.Player.Left
  539.           Case 76 ' 5, enter/accept
  540.             Gosub Update.Hits
  541.           Case 77 ' 6, move player right
  542.             Gosub Move.Player.Right
  543.           Case 71 ' 7, evade monster
  544.             Gosub Evade.Monster
  545.           Case 72 ' 8, move player up
  546.             Gosub Move.Player.Up
  547.           Case 73 ' 9, ignore key/null action/update hits
  548.             Gosub Update.Hits
  549.           Case 82 ' help screen menu
  550.             Gosub Display.Help
  551.           Case 116 ' display dungeon information
  552.             Gosub Display.Info
  553.           Case 83 ' display extended status line 25
  554.             Gosub Extended.Status.Line
  555.           Case 118 ' learned spells display screen
  556.             Gosub Learned.Spells
  557.           Case 119 ' statistic trading menu
  558.             Gosub Trade.Stats
  559.           Case 15 ' inventory purchasing menu
  560.             Gosub Buy.Inventory
  561.           Case 117 ' reselect dungeon level number
  562.             Gosub Store.Dungeon.Level ' store dungeon screen
  563.             Gosub Change.Level
  564.           Case 115 ' inventory display screen
  565.             Gosub Inventory
  566.           Case 132 ' use magic item menu
  567.             Gosub Use.Item
  568.             Gosub Cell.Action ' compute nearby cells
  569.           ' Alt-0 to Alt-9, globe power keys
  570.           Case 120 To 129
  571.             i=Asc(Mid$(x$,2))-119
  572.             Gosub Use.Globe
  573.           Case 131 ' user list
  574.             Gosub User.List
  575.           End Select
  576.         End Select
  577.       Loop Until login=0
  578.     Endif
  579.   Loop Until dlvl#=0
  580. Loop
  581. Color 7, 0 ' reset color
  582. Cls ' clear screen
  583. End ' terminate program
  584.  
  585. ' display message containing the spell cast
  586. Cast.Spell.Message:
  587.  Restore Spell.Data ' reset the data pointer to the spell names
  588.  ' loop to the spell number (sp=spell number, spn=spell type 1 to 4)
  589.  For i=1 to sp+(spn-1)*10
  590.    Read a$, c$ ' read the spell chant and name
  591.  Next
  592.  Color 15 ' ansi color
  593.  a$="You cast a "+c$+" spell!" ' make display message
  594.  Gosub Display.Message ' output message
  595.  Color 7 ' ansi color
  596.  Return ' exit routine
  597.  
  598. Move.Player.Down:
  599.  d=dungeonrec.dat(xco+1,yco)
  600.  ' if the player tries to move through a dungeon
  601.  ' wall and is not in passwall mode then exit
  602.  If d=176 Then
  603.    If pwl=0 Then
  604.      Return ' exit routine
  605.    Endif
  606.  Endif
  607.  ' if the player moves to a cell occupied by a monster,
  608.  ' use the move as an attack on the monster
  609.  If d=35 Then
  610.    mxco=xco+1 ' set monster coordinates
  611.    myco=yco
  612.    Gosub Attack.Monster
  613.    Gosub Monster.Attack
  614.    Gosub Encounter.Cells
  615.    Return ' exit routine
  616.  Endif
  617.  ' otherwise move player down
  618.  If xco<23 Then
  619.    xco=xco+1 ' update player x-coordinate
  620.    Gosub Update.Player ' update nearby cell actions
  621.  Endif
  622.  Return ' exit routine
  623.  
  624. Move.Player.Left:
  625.  d=dungeonrec.dat(xco,yco-1)
  626.  ' if the player tries to move through a dungeon
  627.  ' wall and is not in passwall mode then exit
  628.  If d=176 Then
  629.    If pwl=0 Then
  630.      Return ' exit routine
  631.    Endif
  632.  Endif
  633.  ' if the player moves to a cell occupied by a monster,
  634.  ' use the move as an attack on the monster
  635.  If d=35 Then
  636.    mxco=xco ' set monster coordinates
  637.    myco=yco-1
  638.    Gosub Attack.Monster
  639.    Gosub Monster.Attack
  640.    Gosub Encounter.Cells
  641.    Return ' exit routine
  642.  Endif
  643.  ' otherwise move player left
  644.  If yco>1 Then
  645.    yco=yco-1 ' update player y-coordinate
  646.    Gosub Update.Player ' update nearby cell actions
  647.  Endif
  648.  Return ' exit routine
  649.  
  650. Move.Player.Right:
  651.  ' if the player tries to move through a dungeon
  652.  ' wall and is not in passwall mode then exit
  653.  d=dungeonrec.dat(xco,yco+1)
  654.  If d=176 Then
  655.    If pwl=0 Then
  656.      Return ' exit routine
  657.    Endif
  658.  Endif
  659.  ' if the player moves to a cell occupied by a monster,
  660.  ' use the move as an attack on the monster
  661.  If d=35 Then
  662.    mxco=xco ' set monster coordinates
  663.    myco=yco+1
  664.    Gosub Attack.Monster
  665.    Gosub Monster.Attack
  666.    Gosub Encounter.Cells
  667.    Return ' exit routine
  668.  Endif
  669.  ' otherwise move player right
  670.  If yco<79 Then
  671.    yco=yco+1 ' update player y-coordinate
  672.    Gosub Update.Player ' update nearby cell actions
  673.  Endif
  674.  Return ' exit routine
  675.  
  676. Move.Player.Up:
  677.  d=dungeonrec.dat(xco-1,yco)
  678.  ' if the player tries to move through a dungeon
  679.  ' wall and is not in passwall mode then exit
  680.  If d=176 Then
  681.    If pwl=0 Then
  682.      Return ' exit routine
  683.    Endif
  684.  Endif
  685.  ' if the player moves to a cell occupied by a monster,
  686.  ' use the move as an attack on the monster
  687.  If d=35 Then
  688.    mxco=xco-1 ' set monster coordinates
  689.    myco=yco
  690.    Gosub Attack.Monster
  691.    Gosub Monster.Attack
  692.    Gosub Encounter.Cells
  693.    Return ' exit routine
  694.  Endif
  695.  ' otherwise move player up
  696.  If xco>1 Then
  697.    xco=xco-1 ' update player x-coordinate
  698.    Gosub Update.Player ' update nearby cell actions
  699.  Endif
  700.  Return ' exit routine
  701.  
  702. ' actions for cells next to a player when he moves
  703. Update.Player:
  704.  llc=llc-1 ' decrement extended cell display counter
  705.  If llc<0 Then ' check extended cell display counter
  706.    ll=1 ' reset cell displays cell display amount
  707.    llc=0 ' reset extended cell display counter
  708.  Endif
  709.  gdc=gdc-1 ' decrement extended monster cell death counter
  710.  If gdc<0 Then ' check extended monster cell death counter
  711.    gd=0 ' reset cell monster death flag
  712.    gdc=0 ' reset extended monster cell death counter
  713.  Endif
  714.  ' surrounding cell monster deaths
  715.  If gd Then
  716.    Gosub Cell.Monster.Attack ' all nearby monsters die
  717.  Endif
  718.  ' further cell action routine
  719.  Gosub Cell.Action ' compute nearby cells
  720.  ' player moves to an occupied cell
  721.  Select Case dungeonrec.dat(xco,yco)
  722.  Case 33 ' teleporter (!)
  723.    Gosub Teleporter
  724.  Case 34 ' ring (")
  725.    Gosub Ring
  726.  Case 36 ' pile of coins ($)
  727.    Gosub Find.Coin.Pile
  728.  Case 37 ' staff (%)
  729.    Gosub Staff
  730.  Case 38 ' coins (&)
  731.    Gosub Coins
  732.  Case 42 ' gems (*)
  733.    Gosub Gems
  734.  Case 60 ' staircase down (<)
  735.    Gosub Stairs.Down
  736.  Case 62 ' staircase up (>)
  737.    Gosub Stairs.Up
  738.  Case 63 ' temple (?)
  739.    Gosub Temple
  740.  Case 64 ' potion (@)
  741.    Gosub Potion
  742.  Case 94 ' trap (^)
  743.    Gosub Trap
  744.  Case 111 ' pit (o)
  745.    Gosub Pit
  746.  Case 124 ' wand (|)
  747.    Gosub Wand
  748.  Case 126 ' scroll (~)
  749.    Gosub Scroll
  750.  Case 254 ' chest symbol
  751.    Gosub Find.Chest
  752.  End Select
  753.  Gosub Check.Clear.Dungeon
  754.  Gosub Update.Hits
  755.  Return ' exit routine
  756.  
  757. ' check if all treasure have been found
  758. Check.Clear.Dungeon:
  759.  If dungeonrec.stats(5)=1 Then ' all monsters in dungeon level conquered
  760.    If dungeonrec.stats(4)=0 Then ' all treasure found flag not set
  761.      For x=8 To 32 Step 2 ' loop through dungeon treasure flags
  762.        If dungeonrec.stats(x)=0 Then ' check any treasure not found
  763.          Return ' exit routine
  764.        Endif
  765.      Next
  766.      dungeonrec.stats(4)=1 ' set all dungeon level treasure found flag
  767.      d$="treasure"
  768.      Gosub Treasure.Bonus ' bonus for all treasure
  769.      Color 13 ' ansi color
  770.      a$="The dungeon becomes replenished!" ' make display message
  771.      Gosub Display.Message ' output message
  772.      Gosub Pause.Second ' wait
  773.      Gosub Zero.Dungeon ' first remove all dungeon treasure,
  774.      Gosub Replenish.Dungeon ' restock the dungeon level
  775.    Endif
  776.  Endif
  777.  Return ' exit routine
  778.  
  779. ' calculate award amount of gold for a bonus
  780. Treasure.Bonus:
  781.  ' calculate gold award
  782.  ex#=(Rnd*dlvl#*2+1)*userrec.stats1(2)^2/2
  783.  ex#=ex#+dlvl#*2+Rnd*userrec.stats1(2)*50
  784.  ex#=Int(ex#)
  785.  userrec.stats1(5)=userrec.stats1(5)+ex# ' increment players gold
  786.  Color 14 ' ansi color
  787.  a$="You found all the "+d$+" on this level! You gain"+Str$(ex#)+" gold!"
  788.  Gosub Display.Message ' output message
  789.  Gosub Pause.Second ' wait
  790.  Return ' exit routine
  791.  
  792. ' calculate when to update players combat hits
  793. Update.Hits:
  794.  cnt=cnt+1 ' increment counter each input loop pass
  795.  ' return if counter below 10
  796.  If cnt<10 Then
  797.    Return ' exit routine
  798.  Endif
  799.  cnt=0 ' reset counter
  800.  Gosub Increment.Hits ' update players combat hits
  801.  Return ' exit routine
  802.  
  803. ' calculate players incremented combat hits
  804. Increment.Hits:
  805.  x=userrec.stats1(6) ' maximum hit points
  806.  y=userrec.stats1(4) ' user's hit points
  807.  z=userrec.stats2(4) ' constitution
  808.  If x>y Then ' increment plus constitution
  809.    y=y+z
  810.  Endif
  811.  If y>x Then ' reset to maximum points allowed if over maximum
  812.    y=x
  813.  Endif
  814.  userrec.stats1(4)=y
  815.  Return ' exit routine
  816.  
  817. ' move player up stairs
  818. Stairs.Up:
  819.  Color 14 ' ansi color
  820.  a$="You find a staircase!(5 to climb up or 9 to ignore)"
  821.  Gosub Display.Message ' output message
  822.  Do ' get a keystroke
  823.    Gosub Get.Keystroke
  824.  Loop Until x=5 Or x=9
  825.  ' presses enter/5 to climb up
  826.  If x=5 Then
  827.    Gosub Dungeon.Level.Up ' move player up one dungeon level
  828.  Endif
  829.  Return ' exit routine
  830.  
  831. ' move player down stairs
  832. Stairs.Down:
  833.  Color 14 ' ansi color
  834.  a$="You find a staircase!(5 to climb down or 9 to ignore)"
  835.  Gosub Display.Message ' output message
  836.  Do ' get a keystroke
  837.    Gosub Get.Keystroke
  838.  Loop Until x=5 Or x=9
  839.  ' presses enter/5 to climb down
  840.  If x=5 Then
  841.    Gosub Dungeon.Level.Down ' move player down one dungeon level
  842.  Endif
  843.  Return ' exit routine
  844.  
  845. ' redisplay staircase up symbol,
  846. ' then enter routine to next dungeon level up
  847. Dungeon.Level.Up:
  848.  Color 15 ' ansi color
  849.  Locate xco,yco,0 ' position cursor
  850.  Print ">"; ' make stair symbol
  851.  
  852. ' move player up one dungeon level
  853. Dungeon.Up:
  854.  Gosub Clear.Status.Line2 ' clear status line area
  855.  Gosub Store.Dungeon ' record the dungeon statistics and screen
  856.  Gosub Decrement.Dungeon.Level ' subtract one from dungeon level variable
  857.  If dlvl#>0 Then ' still in dungeon
  858.    Color 10 ' ansi color
  859.    a$="You return to Dungeon level"+Str$(dlvl#)+"!(hit a key)" ' prompt
  860.    Gosub Display.Message ' display next dungeon level reached message
  861.    Gosub Get.Key.Press ' get a single keystroke
  862.    Gosub Next.Dungeon.Level ' load dungeon level statistics
  863.    Gosub Cell.Action ' compute nearby cells
  864.  Endif
  865.  Return ' exit routine
  866.  
  867. Decrement.Dungeon.Level:
  868.  dlvl#=dlvl#-1 ' decrement players dungeon level counter
  869.  If dlvl#<=0 Then ' if the player reaches dungeon level zero, exit game
  870.    login=0 ' player leaves dungeon
  871.    dlvl#=0 ' reset dungeon level counter to zero
  872.    Color 14 ' ansi color
  873.    a$="You escaped the Dungeon!(hit a key)"
  874.    Gosub Display.Message ' output message
  875.    Gosub Get.Key.Press ' get a single keystroke
  876.    Gosub Put.User.File ' store players dungeon level statistics
  877.  Endif
  878.  Return ' exit routine
  879.  
  880. ' redisplay staircase down symbol,
  881. ' then enter routine to next dungeon level down
  882. Dungeon.Level.Down:
  883.  Color 15 ' ansi color
  884.  Locate xco,yco,0 ' position cursor
  885.  Print "<"; ' make stair symbol
  886.  
  887. ' move player down one dungeon level
  888. Dungeon.Down:
  889.  Gosub Clear.Status.Line2 ' clear status line area
  890.  Gosub Store.Dungeon ' record the dungeon statistics and screen
  891.  Gosub Increment.Dungeon.Level
  892.  Return ' exit routine
  893.  
  894. Increment.Dungeon.Level:
  895.  dlvl#=dlvl#+1 ' increment players dungeon level counter
  896.  ' check if player has entered a dungeon level lower than his last recorded
  897.  If dlvl#>userrec.stats1(1) Then
  898.    userrec.stats1(1)=dlvl# ' if lower, set players last dungeon level to current
  899.  Endif
  900.  Color 11 ' ansi color
  901.  a$="You made it to Dungeon level"+Str$(dlvl#)+"!(hit a key)" ' message
  902.  Gosub Display.Message ' display next dungeon level reached message
  903.  Gosub Get.Key.Press ' get a single keystroke
  904.  Gosub Next.Dungeon.Level ' load dungeon level statistics
  905.  Gosub Cell.Action ' compute nearby cells
  906.  Return ' exit routine
  907.  
  908. ' loads dungeon level statistics
  909. Next.Dungeon.Level:
  910.  xdlvl#=dlvl# ' store dungeon level
  911.  While xdlvl#>Lof(2)/Len(dungeonrec) ' new dungeon record,
  912.    dlvl#=Lof(2)/Len(dungeonrec)+1 ' reset dungeon level
  913.    Gosub Make.Dungeon ' create the dungeon level
  914.    Gosub Store.Dungeon ' store new dungeon level
  915.  Wend
  916.  Gosub Load.Dungeon.Level ' get the dungeon level from data file on disk
  917.  Return ' exit routine
  918.  
  919. ' clears status line before storing dungeon level
  920. Store.Dungeon.Level:
  921.  Gosub Clear.Status.Line ' clear status line
  922.  
  923. ' stores current dungeon level screen
  924. Store.Dungeon:
  925.  ' store the dungeon screen
  926.  For i=1 to 24 ' rows by
  927.    For j=1 to 80 ' columns
  928.      ' move character at screen location into data file array
  929.      dungeonrec.scrn(i,j)=screen(i,j)
  930.    Next
  931.  Next
  932.  dungeonrec.stats(2)=xco ' player x-coordinate
  933.  dungeonrec.stats(3)=yco ' player y-coordinate
  934.  ' calculate the number of levels stored, the length of the data file divided
  935.  ' by the length of the structure, check if recording the dungeon level would
  936.  ' access any record number out of range,
  937.  If dlvl#<=Lof(2)/Len(dungeonrec)+1 Then ' check valid level
  938.    Put 2,dlvl#,dungeonrec ' store the dungeon level structure into record
  939.  Endif
  940.  Return ' exit routine
  941.  
  942. ' selects specific dungeon level previously recorded
  943. Change.Level:
  944.  If Lof(2)/Len(dungeonrec)=0 Then ' dungeon records in the data file
  945.    dlvl#=1 ' reset the dungeon level counter to one
  946.    Gosub Make.Dungeon ' create the first dungeon level
  947.    Gosub Store.Dungeon ' store new dungeon level
  948.    Gosub Cell.Action ' compute nearby cells
  949.    Return ' exit routine
  950.  Endif
  951.  If Lof(2)/Len(dungeonrec)=1 Then ' dungeon records in the data file
  952.    Color 14, 1 ' blue background
  953.    Cls ' clear screen
  954.    Locate 12,24,0 ' position cursor
  955.    Color 13 ' ansi color
  956.    Print "You Will Start At Dungeon Level 1"; ' display dungeon level
  957.    Color 7 ' ansi color
  958.    Gosub Pause.Second ' wait
  959.    Gosub Pause.Second ' wait
  960.    Gosub Pause.Second ' wait
  961.    ll=1 ' reset cell displays cell display amount
  962.    dlvl#=1 ' set dungeon level variable
  963.    Gosub Load.Dungeon.Level ' load the dungeon statistics and screen
  964.    Gosub Cell.Action ' compute nearby cells
  965.    Return ' exit routine
  966.  Endif
  967.  Do ' loop to get dungeon level input into l$
  968.    ' calculate the number of levels stored, the length of the data file
  969.    ' divided by the length of the structure, if there are no
  970.    Color 14, 1 ' blue background
  971.    Cls ' clear screen
  972.    i$="You made it as far as level"+Str$(Lof(2)/Len(dungeonrec))+"!" ' make prompt
  973.    i=40-Int(len(i$)/2) ' calculate prompt center
  974.    Locate 10,i,0 ' position cursor
  975.    Color 14 ' ansi color
  976.    Print "You made it as far as level";Str$(Lof(2)/Len(dungeonrec));"!";
  977.    Locate 11,23,0 ' position cursor
  978.    Color 10 ' ansi color
  979.    Print "Which level will you start at now?" ' display input prompt
  980.    Color 15 ' ansi color
  981.    l$="" ' clear input
  982.    Locate 13,30,1 ' position cursor
  983.    ' loop to retrieve l$ input character by character.
  984.    '   backspace, enter, and characters 0 to 9 are accepted,
  985.    '   otherwise a beep, or beep for backspace before column one,
  986.    '   or beep for enter with no characters input. Maximum 8 characters.
  987.    Do
  988.      x$="" ' get keystroke
  989.      While x$="" ' wait for input
  990.        x$=Inkey$ ' get keystroke
  991.      Wend ' end wait
  992.      Select Case x$ ' select user input
  993.      Case Chr$(13) ' enter key
  994.        If Len(l$) Then
  995.          Exit Do ' exit loop
  996.        Endif
  997.        Beep ' warning signal
  998.      Case Chr$(8) ' backspace
  999.        If Len(l$)=0 Then
  1000.          Beep ' warning signal
  1001.        Else
  1002.          Locate Csrlin,Pos(0)-1,1 ' position cursor
  1003.          Print " ";
  1004.          Locate Csrlin,Pos(0)-1,1 ' position cursor
  1005.          l$=Left$(l$,Len(l$)-1) ' truncate input string one character
  1006.        Endif
  1007.      Case "0" To "9" ' check valid character
  1008.        If Len(l$)=8 Then ' verify length of string
  1009.          Beep ' warning signal
  1010.        Else
  1011.          l$=l$+x$ ' append to l$
  1012.          Print x$;
  1013.        Endif
  1014.      End Select
  1015.    Loop
  1016.    dlvl#=Val(l$) ' convert l$ to dungeon level variable
  1017.    ' if the dungeon level is within range of the records in the data file,
  1018.    If dlvl#>0 And dlvl#<=Lof(2)/Len(dungeonrec) Then
  1019.      ll=1 ' reset cell displays cell display amount
  1020.      Gosub Load.Dungeon.Level ' load the dungeon statistics and screen
  1021.      Gosub Cell.Action ' compute nearby cells
  1022.      Exit Do ' exit the loop
  1023.    Endif
  1024.    ' otherwise, display message
  1025.    i$="You have only"+Str$(Lof(2)/Len(dungeonrec))+" to choose from.."
  1026.    i=40-Int(Len(i$)/2+1) ' calculate prompt center
  1027.    Locate 15,i,0 ' position cursor
  1028.    Color 13 ' ansi color
  1029.    Print "You have only";Str$(Lof(2)/Len(dungeonrec));" levels to choose from."
  1030.    Color 7 ' ansi color
  1031.    Locate 13,30,0 ' position cursor
  1032.    Print Space$(8);
  1033.    Gosub Key.Press ' get a keystroke
  1034.  Loop
  1035.  Return ' exit routine
  1036.  
  1037. ' redisplay dungeon dot, then clear status line area
  1038. Clear.Status.Line:
  1039.  Color 7 ' ansi color
  1040.  Locate xco,yco,0 ' position cursor
  1041.  Print "."; ' dungeon dot
  1042.  
  1043. ' clear status line area
  1044. Clear.Status.Line2:
  1045.  color 7 ' ansi color
  1046.  Locate 24,1,0 ' position cursor
  1047.  Print Space$(79);
  1048.  Locate 25,1,0 ' position cursor
  1049.  Print Space$(79);
  1050.  Return ' exit routine
  1051.  
  1052. ' load dungeon level from data file on disk
  1053. Load.Dungeon.Level:
  1054.  ' if there are less dungeon record structures recorded in the data file
  1055.  ' than the dungeon level requested to read from,
  1056.  If Lof(2)/Len(dungeonrec)<dlvl# Then
  1057.    Gosub Make.Dungeon ' then the dungeon level is created,
  1058.    Gosub Store.Dungeon ' store new dungeon level
  1059.    Gosub Cell.Action ' compute nearby cells
  1060.    Return ' exit routine
  1061.  Endif
  1062.  ' otherwise, read the dungeon record structure
  1063.  
  1064. ' restores dungeon screen
  1065. Restore.Screen:
  1066.  ' read the dungeon record structure
  1067.  Get 2,dlvl#,dungeonrec
  1068.  Color 14, 1 ' blue background
  1069.  Cls ' clear the screen
  1070.  For i=1 to 24 ' rows by
  1071.    For j=1 to 79 ' columns
  1072.      Locate i,j,0 ' locate at dungeon xy
  1073.      ' display character in dungeon screen array on screen
  1074.      x=dungeonrec.scrn(i,j) ' get character
  1075.      If x=32 Then ' blank space
  1076.        Locate Csrlin,Pos(0)+1,0 ' increment cursor y position
  1077.      Else
  1078.        If x=46 Or x=176 Then ' color white for
  1079.          k=dungeonrec.dat(i,j) ' ascii of dungeon coordinate
  1080.          If k>21 And k<26 Then ' compare dot
  1081.             Color 15 ' dungeon room border
  1082.          Else ' color dot
  1083.             Color 7 ' dungeon dot/wall
  1084.          Endif
  1085.        Else ' color highlight white for
  1086.          Color 15 ' other symbols
  1087.        Endif
  1088.        Print Chr$(x); ' print ascii character
  1089.      Endif
  1090.    Next
  1091.    Color 7 ' display rightmost column
  1092.    If dungeonrec.scrn(i,j)=176 Then ' dungeon wall
  1093.      Print Chr$(176); ' print ascii character
  1094.    Endif
  1095.  Next
  1096.  xco=dungeonrec.stats(2) ' player x-coordinate
  1097.  yco=dungeonrec.stats(3) ' player y-coordinate
  1098.  Color 15 ' display player's character
  1099.  Locate xco,yco,0 ' in highlight white
  1100.  Print "X";
  1101.  Return
  1102.  
  1103. ' enter a teleporter
  1104. Teleporter:
  1105.  dungeonrec.dat(xco,yco)=46 ' reset cell with dungeon dot
  1106.  Color 14 ' ansi color
  1107.  a$="You find a teleporter!(5 to enter or 9 to ignore)"
  1108.  Gosub Display.Message ' output message
  1109.  Do ' get a keystroke
  1110.    Gosub Get.Keystroke
  1111.  Loop Until x=5 Or x=9
  1112.  ' presses enter/5 to enter teleporter
  1113.  If x=5 Then
  1114.    Color 7 ' ansi color
  1115.    Locate xco,yco,0 ' position cursor
  1116.    Print "."; ' replace character X with dungeon dot
  1117.    ' teleport player based on wisdom
  1118.    If Int(Rnd*8+8)>userrec.stats2(3) Then
  1119.      Gosub Teleport
  1120.    Else
  1121.      ' otherwise, teleport one dungeon level
  1122.      If Rnd>.5 Then
  1123.        Gosub Dungeon.Up ' up random 50/50
  1124.      Else
  1125.        Gosub Dungeon.Down ' or down random 50/50
  1126.      Endif
  1127.    Endif
  1128.  Endif ' no action for ignore/9
  1129.  dungeonrec.stats(15)=dungeonrec.stats(15)-1 ' decrement dungeon teleporters
  1130.  If dungeonrec.stats(15)=0 Then ' player has entered last teleporter
  1131.    If dungeonrec.stats(16)=0 Then
  1132.      dungeonrec.stats(16)=1 ' set all dungeon level teleporter flag
  1133.    Endif
  1134.  Endif
  1135.  Return ' exit routine
  1136.  
  1137. ' enter temple
  1138. Temple:
  1139.  dungeonrec.dat(xco,yco)=46 ' reset cell with dungeon dot
  1140.  Color 14 ' ansi color
  1141.  a$="You find a temple!(5 to pray, 7 to pillage, or 9 to ignore)"
  1142.  Gosub Display.Message ' output message
  1143.  Do ' get a keystroke
  1144.    Gosub Get.Keystroke
  1145.  Loop Until x=5 Or x=7 Or x=9
  1146.  ' presses enter/5 to pray or evade/7 to pillage
  1147.  If x=5 Then
  1148.    ' reward player based on charisma
  1149.    If Int(Rnd*8+8)>userrec.stats2(6) Then ' low charisma
  1150.      Color 10 ' ansi color
  1151.      a$="Nothing happens.." ' make display message
  1152.      Gosub Display.Message ' output message
  1153.    Else ' high charisma
  1154.      Color 10 ' ansi color
  1155.      a$="You are rewarded with great treasure!" ' make display message
  1156.      Gosub Display.Message ' output message
  1157.      Gosub Pause.Second ' wait
  1158.      Gosub Coin.Pile
  1159.    Endif
  1160.  Else
  1161.    ' pillage/7 is pressed
  1162.    If x=7 Then
  1163.      ' reward player based on charisma
  1164.      If Int(Rnd*8+8)>userrec.stats2(6) Then ' low charisma
  1165.        Color 10 ' ansi color
  1166.        a$="The Ghods are angered!" ' make display message
  1167.        mhp#=0 ' set hits to zero for
  1168.        Gosub Hit.Player ' routine to calculate hits on player
  1169.      Else ' high charisma
  1170.        Color 10 ' ansi color
  1171.        a$="You are rewarded with great treasure!" ' make display message
  1172.        Gosub Display.Message ' output message
  1173.        Gosub Pause.Second ' wait
  1174.        Gosub Chest ' opens a chest
  1175.      Endif
  1176.    Endif
  1177.  Endif ' no action for ignore/9
  1178.  dungeonrec.stats(17)=dungeonrec.stats(17)-1 ' decrement dungeon level temple
  1179.  If dungeonrec.stats(17)=0 Then ' player has entered last temple
  1180.    If dungeonrec.stats(18)=0 Then
  1181.      dungeonrec.stats(18)=1 ' set all dungeon level temple flag
  1182.    Endif
  1183.  Endif
  1184.  Return ' exit routine
  1185.  
  1186. ' find gems
  1187. Gems:
  1188.  dungeonrec.dat(xco,yco)=46 ' reset cell with dungeon dot
  1189.  ' select gem type
  1190.  ran!=Rnd ' based on percentage
  1191.  If ran!>.85 Then
  1192.    bonus=8 ' multiplier
  1193.    b$="diamonds" ' gem name
  1194.  Else
  1195.    If ran!>.75 Then
  1196.      bonus=5 ' multiplier
  1197.      b$="emeralds" ' gem name
  1198.    Else
  1199.      If ran!>.50 Then
  1200.        bonus=3 ' multiplier
  1201.        b$="saphires" ' gem name
  1202.      Else
  1203.        bonus=2 ' multiplier
  1204.        b$="rubies" ' gem name
  1205.      Endif
  1206.    Endif
  1207.  Endif
  1208.  Color 14 ' ansi color
  1209.  a$="You find some "+b$+"!" ' make display message
  1210.  Gosub Display.Message ' output message
  1211.  ' calculate increment to players gold by bonus multiplier
  1212.  temp#=Rnd*userrec.stats1(2)
  1213.  temp#=temp#+Rnd*userrec.stats1(2)+10
  1214.  temp#=Int(temp#*bonus)
  1215.  userrec.stats1(5)=userrec.stats1(5)+temp#
  1216.  dungeonrec.stats(19)=dungeonrec.stats(19)-1 ' decrement dungeon level gems
  1217.  If dungeonrec.stats(19)=0 Then ' player has taken last gem
  1218.    If dungeonrec.stats(20)=0 Then
  1219.      dungeonrec.stats(20)=1 ' set all dungeon level gem flag
  1220.      d$="gems"
  1221.      Gosub Treasure.Bonus ' bonus for last gem
  1222.    Endif
  1223.  Endif
  1224.  Return ' exit routine
  1225.  
  1226. ' find coins
  1227. Coins:
  1228.  dungeonrec.dat(xco,yco)=46 ' reset cell with dungeon dot
  1229.  bonus=Int(Rnd*dlvl#+5) ' number of coins
  1230.  Color 14 ' ansi color
  1231.  a$="You find"+Str$(bonus)+" coins!" ' make display message
  1232.  Gosub Display.Message ' output message
  1233.  ' calculate increment to players gold by bonus multiplier
  1234.  userrec.stats1(5)=userrec.stats1(5)+bonus*100
  1235.  dungeonrec.stats(21)=dungeonrec.stats(21)-1 ' decrement dungeon level coins
  1236.  If dungeonrec.stats(21)=0 Then ' player has taken last coin
  1237.    If dungeonrec.stats(22)=0 Then
  1238.      dungeonrec.stats(22)=1 ' set all dungeon level coins flag
  1239.      d$="coins"
  1240.      Gosub Treasure.Bonus ' bonus for last coin
  1241.    Endif
  1242.  Endif
  1243.  Return ' exit routine
  1244.  
  1245. ' find coin pile
  1246. Find.Coin.Pile:
  1247.  dungeonrec.dat(xco,yco)=46 ' reset cell to dungeon dot
  1248.  Gosub Coin.Pile ' get coins to add to gold
  1249.  dungeonrec.stats(11)=dungeonrec.stats(11)-1 ' decrement dungeon level gold
  1250.  If dungeonrec.stats(11)=0 Then ' player has the last gold
  1251.    If dungeonrec.stats(12)=0 Then
  1252.      dungeonrec.stats(12)=1 ' set all dungeon level gold flag
  1253.      d$="coin piles"
  1254.      Gosub Treasure.Bonus ' bonus for all gold
  1255.    Endif
  1256.  Endif
  1257.  Return ' exit routine
  1258.  
  1259. ' calculate coin pile
  1260. Coin.Pile:
  1261.  ' select coin type
  1262.  ran!=Rnd ' based on percentage
  1263.  If ran!>.85 Then
  1264.    bonus=8 ' multiplier
  1265.    b$="platinum" ' coin name
  1266.  Else
  1267.    If ran!>.75 Then
  1268.      bonus=5 ' multiplier
  1269.      b$="gold" ' coin name
  1270.    Else
  1271.      If ran!>.50 Then
  1272.        bonus=3 ' multiplier
  1273.        b$="silver" ' coin name
  1274.      Else
  1275.        bonus=2 ' multiplier
  1276.        b$="copper" ' coin name
  1277.      Endif
  1278.    Endif
  1279.  Endif
  1280.  Color 14 ' ansi color
  1281.  a$="You find some "+b$+" coins!" ' make display message
  1282.  Gosub Display.Message ' output message
  1283.  ' calculate increment to players gold by bonus multiplier
  1284.  temp#=Rnd*dlvl#
  1285.  temp#=temp#+Rnd*userrec.stats1(2)+10
  1286.  temp#=Int(temp#*bonus*10)
  1287.  userrec.stats1(5)=userrec.stats1(5)+temp#
  1288.  Return ' exit routine
  1289.  
  1290. ' find scroll
  1291. Scroll:
  1292.  dungeonrec.dat(xco,yco)=46 ' reset cell to dungeon dot
  1293.  Color 14 ' ansi color
  1294.  a$="You find a scroll!(5 to take or 9 to ignore)"
  1295.  Gosub Display.Message ' output message
  1296.  Do ' get a keystroke
  1297.    Gosub Get.Keystroke
  1298.  Loop Until x=5 Or x=9
  1299.  ' presses  enter/5 to take scroll
  1300.  If x=5 Then 
  1301.    rand=Int(Rnd*40+1) ' select a random spell from 40
  1302.    Restore Spell.Data ' restore data pointer to spell data
  1303.    userrec.spell(rand)=1 ' set spell flag
  1304.    For i=1 To rand ' read spell
  1305.      Read b$,c$ ' spell chant, spell name
  1306.    Next
  1307.    Color 11 ' display spell chant in quotes
  1308.    a$="The scroll reads "+Chr$(34)+b$+Chr$(34)
  1309.    Gosub Display.Message ' output message
  1310.  Endif ' no action for ignore/9
  1311.  dungeonrec.stats(7)=dungeonrec.stats(7)-1 ' decrement dungeon level scroll
  1312.  If dungeonrec.stats(7)=0 Then ' player has the last scroll
  1313.    If dungeonrec.stats(8)=0 Then
  1314.      dungeonrec.stats(8)=1 ' set all dungeon level scroll flag
  1315.      d$="scrolls"
  1316.      Gosub Treasure.Bonus ' bonus for all scrolls
  1317.    Endif
  1318.  Endif
  1319.  Return ' exit routine
  1320.  
  1321. ' enter chant of spell to cast
  1322. Cast.Chant:
  1323.  Color 12 ' ansi color
  1324.  a$="Type in spell chant:" ' make display message prompt
  1325.  Gosub Display.Message ' output message
  1326.  Color 15 ' ansi color
  1327.  ' loop to retrieve spell$ character by character.
  1328.  '   backspace, enter, and characters A to Z are accepted,
  1329.  '   otherwise a beep, or beep for backspace before column one,
  1330.  '   or beep for enter with no characters input. Maximum 55 characters.
  1331.  spell$="" ' clear spell$
  1332.  Locate 25,22,1 ' position cursor
  1333.  Do
  1334.    x$="" ' get keystroke
  1335.    While x$="" ' wait for input
  1336.      x$=Inkey$ ' get keystroke
  1337.    Wend ' end wait
  1338.    Select Case x$
  1339.    Case Chr$(13) ' enter pressed
  1340.      Exit Do
  1341.    Case Chr$(8) ' backspace
  1342.      If Len(Spell$)=0 Then
  1343.        Beep ' warning signal
  1344.      Else
  1345.        Locate Csrlin,Pos(0)-1,1 ' position cursor
  1346.        Print " ";
  1347.        Locate Csrlin,Pos(0)-1,1 ' position cursor
  1348.        spell$=Left$(spell$,Len(spell$)-1) ' truncate input string one character
  1349.      Endif
  1350.    Case "a" To "z", "A" To "Z", " " 'check valid character
  1351.      If Len(spell$)=55 Then ' verify length of string
  1352.        Beep ' warning signal
  1353.      Else
  1354.        spell$=spell$+x$ ' append to spell$
  1355.        Print x$;
  1356.      Endif
  1357.    End Select
  1358.  Loop
  1359.  spell$=Lcase$(spell$)
  1360.  Color 7 ' ansi color
  1361.  Restore Spell.Data ' restore data pointer to spell data
  1362.  Gosub Pause.Second ' wait
  1363.  For i=1 To 40 ' read 40 spell data items
  1364.    Read a$, c$ ' read chant, spell name
  1365.    If a$=spell$ Then ' compare input string to spell chant
  1366.      spn=Int((i-1)/10)+1 ' calculate spell type 1 to 4
  1367.      sp=i-(spn-1)*10 ' calculate spell number 1 to 10
  1368.      Select Case spn ' select spell type
  1369.      Case 1 ' spell type 1
  1370.        Gosub Cast.Spell.Type1
  1371.      Case 2 ' spell type 2
  1372.        Gosub Cast.Spell.Type2
  1373.      Case 3 ' spell type 3
  1374.        Gosub Cast.Spell.Type3
  1375.      Case 4 ' spell type 4
  1376.        Gosub Cast.Spell.Type4
  1377.      End Select
  1378.      Return ' exit routine
  1379.    Endif
  1380.  Next
  1381.  Color 13 ' ansi color
  1382.  a$="That spell chant does nothing!" ' make display message
  1383.  Gosub Display.Message ' output message
  1384.  Return ' exit routine
  1385.  
  1386. ' use an item of magic from inventory
  1387. Use.Item:
  1388.  Color 14 ' ansi color
  1389.  a$="Enter item(1=wand, 3=potion, 5=staff, 7=ring, or 9 to quit)"
  1390.  Gosub Display.Message ' output message
  1391.  Do ' get a keystroke
  1392.    Gosub Get.Keystroke
  1393.  Loop Until x=1 Or x=3 Or x=5 Or x=7 Or x=9
  1394.  ' presses 1, 3, 5, 7, to use inventory item
  1395.  ' use a wand from inventory
  1396.  If x=1 Then 
  1397.    Color 12 ' ansi color
  1398.    a$="Type in wand letter(A-J):" ' make display message prompt
  1399.    Gosub Display.Message ' output message
  1400.    Locate 25,28,1 ' position cursor
  1401.    Do ' loop until alphaletter A to J is pressed
  1402.      x$="" ' get keystroke
  1403.      While x$="" ' wait for input
  1404.        x$=Inkey$ ' get keystroke
  1405.      Wend ' end wait
  1406.      x$=Ucase$(x$)
  1407.      If x$>="A" And x$<="J" Then
  1408.         Exit Do
  1409.      Endif
  1410.    Loop
  1411.    Color 7 ' ansi color
  1412.    i=asc(x$)-64 ' calculate wand number 1 to 10
  1413.    Gosub Use.Wand ' use selected wand
  1414.    Return ' exit routine
  1415.  Endif
  1416.  ' use a potion from inventory
  1417.  If x=3 Then 
  1418.    Color 12 ' ansi color
  1419.    a$="Type in potion letter(K-T):" ' make display message prompt
  1420.    Gosub Display.Message ' output message
  1421.    Locate 25,30,1 ' position cursor
  1422.    Do ' loop until alphaletter K to T is pressed
  1423.      x$="" ' get keystroke
  1424.      While x$="" ' wait for input
  1425.        x$=Inkey$ ' get keystroke
  1426.      Wend ' end wait
  1427.      x$=Ucase$(x$)
  1428.      If x$>="K" And x$<="T" Then
  1429.        Exit Do
  1430.      Endif
  1431.    Loop
  1432.    Color 7 ' ansi color
  1433.    i=asc(x$)-74 ' calculate potion number 1 to 10
  1434.    Gosub Use.Potion ' use selected potion
  1435.    Return ' exit routine
  1436.  Endif
  1437.  ' use a staff from inventory
  1438.  If x=5 Then 
  1439.    Color 12 ' ansi color
  1440.    a$="Type in staff letter(Q-Z):" ' make display message prompt
  1441.    Gosub Display.Message ' output message
  1442.    Locate 25,28,0 ' position cursor
  1443.    Do ' loop until alphaletter Q to Z is pressed
  1444.      x$="" ' get keystroke
  1445.      While x$="" ' wait for input
  1446.        x$=Inkey$ ' get keystroke
  1447.      Wend ' end wait
  1448.      x$=Ucase$(x$)
  1449.      If x$>="Q" And x$<="Z" Then
  1450.         Exit Do
  1451.      Endif
  1452.    Loop
  1453.    Color 7 ' ansi color
  1454.    i=asc(x$)-80 ' calculate staff number 1 to 10
  1455.    Gosub Use.Staff ' use selected staff
  1456.    Return ' exit routine
  1457.  Endif
  1458.  ' use a ring from inventory
  1459.  If x=7 Then 
  1460.    Color 12 ' ansi color
  1461.    a$="Type in ring letter(Q-Z):" ' make display message prompt
  1462.    Gosub Display.Message ' output message
  1463.    Locate 25,28,1 ' position cursor
  1464.    Do ' loop until alphaletter Q to Z is pressed
  1465.      x$="" ' get keystroke
  1466.      While x$="" ' wait for input
  1467.        x$=Inkey$ ' get keystroke
  1468.      Wend ' end wait
  1469.      x$=Ucase$(x$)
  1470.      If x$>="Q" And x$<="Z" Then
  1471.         Exit Do
  1472.      Endif
  1473.    Loop
  1474.    Color 7 ' ansi color
  1475.    i=asc(x$)-80 ' calculate ring number 1 to 10
  1476.    Gosub Use.Ring ' use selected ring
  1477.    Return ' exit routine
  1478.  Endif
  1479.  Return ' exit routine
  1480.  
  1481. ' use selected wand
  1482. Use.Wand:
  1483.  Restore Wand.Data ' restore data pointer to wand data
  1484.  For j=1 To i ' read up to selected wand in variable i
  1485.    Read b$, x ' wand name, spell number
  1486.  Next
  1487.  ' check for wand charges
  1488.  If userrec.wand(i)=0 Then ' no charges left
  1489.    Color 13 ' ansi color
  1490.    a$="You do not have a "+b$+" wand!" ' make display message
  1491.    Gosub Display.Message ' output message
  1492.    Return ' exit routine
  1493.  Endif
  1494.  Color 13 ' ansi color
  1495.  a$="You use a "+b$+" wand!" ' for wand selected
  1496.  userrec.wand(i)=userrec.wand(i)-1 ' decrement wand charges
  1497.  If userrec.wand(i)=0 Then ' verify wand charges
  1498.    a$=a$+" It vanished!" ' make display message, empty wand
  1499.  Endif
  1500.  Gosub Display.Message ' output message
  1501.  Gosub Pause.Second ' wait
  1502.  spn=Int((x-1)/10)+1 ' calculate spell type from data in variable x
  1503.  sp=x-(spn-1)*10 ' calculate spell number from data in variable x
  1504.  Select Case spn ' select spell type
  1505.  Case 1 ' spell type 1
  1506.    Gosub Cast.Spell.Type1
  1507.  Case 2 ' spell type 2
  1508.    Gosub Cast.Spell.Type2
  1509.  Case 3 ' spell type 3
  1510.    Gosub Cast.Spell.Type3
  1511.  Case 4 ' spell type 4
  1512.    Gosub Cast.Spell.Type4
  1513.  End Select
  1514.  Return ' exit routine
  1515.  
  1516. ' use a selected potion
  1517. Use.Potion:
  1518.  Restore Potion.Data ' restore data pointer to potion data
  1519.  For j=1 To i ' read up to selected potion in variable i
  1520.    Read b$, x ' potion name, spell number
  1521.  Next
  1522.  ' check for potion charges
  1523.  If userrec.potion(i)=0 Then ' no charges left
  1524.    Color 13 ' ansi color
  1525.    a$="You do not have a "+b$+" potion!" ' make display message
  1526.    Gosub Display.Message ' output message
  1527.    Return ' exit routine
  1528.  Endif
  1529.  Color 13 ' ansi color
  1530.  a$="You drink a "+b$+" potion!" ' for potion selected
  1531.  userrec.potion(i)=userrec.potion(i)-1 ' decrement potion charges
  1532.  If userrec.potion(i)=0 Then ' verify potion charges
  1533.    a$=a$+" It vanished!" ' make display message, for empty potion
  1534.  Endif
  1535.  Gosub Display.Message ' output message
  1536.  Gosub Pause.Second ' wait
  1537.  spn=Int((x-1)/10)+1 ' calculate spell type from variable x
  1538.  sp=x-(spn-1)*10 ' calculate spell number from variable x
  1539.  Select Case spn ' select spell type
  1540.  Case 1 ' spell type 1
  1541.    Gosub Cast.Spell.Type1
  1542.  Case 2 ' spell type 2
  1543.    Gosub Cast.Spell.Type2
  1544.  Case 3 ' spell type 3
  1545.    Gosub Cast.Spell.Type3
  1546.  Case 4 ' spell type 4
  1547.    Gosub Cast.Spell.Type4
  1548.  End Select
  1549.  Return ' exit routine
  1550.  
  1551. ' use selected staff
  1552. Use.Staff:
  1553.  Restore Staff.Data ' restore data pointer to staff data
  1554.  For j=1 To i ' read up to selected staff in variable i
  1555.    Read b$, x ' staff name, spell number
  1556.  Next
  1557.  ' check for staff charges
  1558.  If userrec.staff(i)=0 Then ' no charges left
  1559.    Color 13 ' ansi color
  1560.    a$="You do not have a "+b$+" staff!" ' make display message
  1561.    Gosub Display.Message ' output message
  1562.    Return ' exit routine
  1563.  Endif
  1564.  Color 13 ' ansi color
  1565.  a$="You use a "+b$+" staff!" ' for selected staff
  1566.  userrec.staff(i)=userrec.staff(i)-1 ' decrement staff charges
  1567.  If userrec.staff(i)=0 Then ' verify staff charges
  1568.    a$=a$+" It vanished!" ' make display message, for empty staff
  1569.  Endif
  1570.  Gosub Display.Message ' output message
  1571.  Gosub Pause.Second ' wait
  1572.  spn=Int((x-1)/10)+1 ' calculate spell type from variable x
  1573.  sp=x-(spn-1)*10 ' calculate spell number from variable x
  1574.  Select Case spn ' select spell type
  1575.  Case 1 ' spell type 1
  1576.    Gosub Cast.Spell.Type1
  1577.  Case 2 ' spell type 2
  1578.    Gosub Cast.Spell.Type2
  1579.  Case 3 ' spell type 3
  1580.    Gosub Cast.Spell.Type3
  1581.  Case 4 ' spell type 4
  1582.    Gosub Cast.Spell.Type4
  1583.  End Select
  1584.  Return ' exit routine
  1585.  
  1586. ' use selected ring
  1587. Use.Ring:
  1588.  Restore Ring.Data ' restore data pointer to ring data
  1589.  For j=1 To i ' read up to selected ring in variable i
  1590.    Read b$, x ' staff name, spell number
  1591.  Next
  1592.  ' check for ring charges
  1593.  If userrec.ring(i)=0 Then ' no charges left
  1594.    Color 13 ' ansi color
  1595.    a$="You do not have a "+b$+" ring!" ' make display message
  1596.    Gosub Display.Message ' output message
  1597.    Return ' exit routine
  1598.  Endif
  1599.  Color 13 ' ansi color
  1600.  a$="You use a "+b$+" ring!" ' for selected ring
  1601.  userrec.ring(i)=userrec.ring(i)-1 ' decrement ring charges
  1602.  If userrec.ring(i)=0 Then ' verify ring charges
  1603.    a$=a$+" It vanished!" ' make display message, for empty ring
  1604.  Endif
  1605.  Gosub Display.Message ' output message
  1606.  Gosub Pause.Second ' wait
  1607.  spn=Int((x-1)/10)+1 ' calculate spell type from variable x
  1608.  sp=x-(spn-1)*10 ' calculate spell number from variable x
  1609.  Select Case spn ' select spell type
  1610.  Case 1 ' spell type 1
  1611.    Gosub Cast.Spell.Type1
  1612.  Case 2 ' spell type 2
  1613.    Gosub Cast.Spell.Type2
  1614.  Case 3 ' spell type 3
  1615.    Gosub Cast.Spell.Type3
  1616.  Case 4 ' spell type 4
  1617.    Gosub Cast.Spell.Type4
  1618.  End Select
  1619.  Return ' exit routine
  1620.  
  1621. ' find a wand
  1622. Wand:
  1623.  dungeonrec.dat(xco,yco)=46 ' reset dungeon cell to dungeon dot
  1624.  Color 14 ' ansi color
  1625.  a$="You find a wand!(5 to take or 9 to ignore)"
  1626.  Gosub Display.Message ' output message
  1627.  Do ' get a keystroke
  1628.    Gosub Get.Keystroke
  1629.  Loop Until x=5 Or x=9
  1630.  ' presses enter/5 to take wand
  1631.  If x=5 Then 
  1632.    rand=Int(Rnd*10+1) ' select a random wand from 10
  1633.    Restore Wand.Data ' restore data pointer to wand data
  1634.    For i=1 To rand ' read up to random wand number
  1635.      Read b$, x ' wand name, spell number
  1636.    Next
  1637.    a=userrec.wand(rand) ' get wand array number
  1638.    If a Then ' if wand exists in inventory
  1639.      Color 10  ' ansi color
  1640.      a$="You already have a wand of "+b$+"!" ' make display message
  1641.    Else
  1642.      Color 13 ' ansi color
  1643.      a$="You now have a wand of "+b$+"!" ' make display message
  1644.      userrec.wand(rand)=Int(Rnd*3+1) ' set wand array number to random charges
  1645.    Endif
  1646.    Gosub Display.Message ' output message
  1647.    Gosub Pause.Second ' wait
  1648.  Endif
  1649.  ' determine existing wands in dungeon level
  1650.  dungeonrec.stats(25)=dungeonrec.stats(25)-1 ' decrement dungeon level wand
  1651.  If dungeonrec.stats(25)=0 Then ' player has taken last wand
  1652.    If dungeonrec.stats(26)=0 Then
  1653.      dungeonrec.stats(26)=1 ' set all dungeon level wand flag
  1654.      d$="wands"
  1655.      Gosub Treasure.Bonus ' bonus for last wand
  1656.    Endif
  1657.  Endif
  1658.  Return ' exit routine
  1659.  
  1660. ' find a potion
  1661. Potion:
  1662.  dungeonrec.dat(xco,yco)=46 ' reset dungeon cell to dungeno dot
  1663.  Color 14 ' ansi color
  1664.  a$="You find a potion!(5 to take or 9 to ignore)"
  1665.  Gosub Display.Message ' output message
  1666.  Do ' get a keystroke
  1667.    Gosub Get.Keystroke
  1668.  Loop Until x=5 Or x=9
  1669.  ' presses enter/5 to take potion
  1670.  If x=5 Then 
  1671.    rand=Int(Rnd*10+1) ' select a random potion from 10
  1672.    Restore Potion.Data ' restore data pointer to potion data
  1673.    For i=1 To rand ' read up to random potion number
  1674.      Read b$, x ' potion name, spell number
  1675.    Next
  1676.    a=userrec.potion(rand) ' get potion array number
  1677.    If a Then ' if potion exists in inventory
  1678.      Color 10 ' ansi color
  1679.      a$="You already have a potion of "+b$+"!" ' make display message
  1680.    Else
  1681.      Color 13 ' ansi color
  1682.      a$="You now have a potion of "+b$+"!" ' make display message
  1683.      userrec.potion(rand)=Int(Rnd*3+2) ' set potion array number random charges
  1684.    Endif
  1685.    Gosub Display.Message ' output message
  1686.    Gosub Pause.Second ' wait
  1687.  Endif
  1688.  ' determine existing potions in dungeon level
  1689.  dungeonrec.stats(27)=dungeonrec.stats(27)-1 ' decrement dungeon level potion
  1690.  If dungeonrec.stats(27)=0 Then ' player has take last potion
  1691.    If dungeonrec.stats(28)=0 Then
  1692.      dungeonrec.stats(28)=1 ' set all dungeon level potion flag
  1693.      d$="potions"
  1694.      Gosub Treasure.Bonus ' bonus for last potion
  1695.    Endif
  1696.  Endif
  1697.  Return ' exit routine
  1698.  
  1699. ' find a staff
  1700. Staff:
  1701.  dungeonrec.dat(xco,yco)=46 ' reset dungeon cell to dungeon dot
  1702.  Color 14 ' ansi color
  1703.  a$="You find a staff!(5 to take or 9 to ignore)"
  1704.  Gosub Display.Message ' output message
  1705.  Do ' get a keystroke
  1706.    Gosub Get.Keystroke
  1707.  Loop Until x=5 Or x=9
  1708.  ' presses enter/5 to take staff
  1709.  If x=5 Then 
  1710.    rand=Int(Rnd*10+1) ' select a random staff from 10
  1711.    Restore Staff.Data ' restore data pointer to staff data
  1712.    For i=1 To rand ' read up to random staff number
  1713.      Read b$, x ' staff name, spell number
  1714.    Next
  1715.    a=userrec.staff(rand) ' get staff array number
  1716.    If a Then ' if staff exists in inventory
  1717.      Color 10 ' ansi color
  1718.      a$="You already have a staff of "+b$+"!" ' make display message
  1719.    Else
  1720.      Color 13 ' ansi color
  1721.      a$="You now have a staff of "+b$+"!" ' make display message
  1722.      userrec.staff(rand)=Int(Rnd*3+2) ' set staff array number random charges
  1723.    Endif
  1724.    Gosub Display.Message ' output message
  1725.    Gosub Pause.Second ' wait
  1726.  Endif
  1727.  ' determine existing staffs in dungeon level
  1728.  dungeonrec.stats(29)=dungeonrec.stats(29)-1 ' decrement dungeon level staff
  1729.  If dungeonrec.stats(29)=0 Then ' player has taken last staff
  1730.    If dungeonrec.stats(30)=0 Then
  1731.      dungeonrec.stats(30)=1 ' set all dungeon level staff flag
  1732.      d$="staffs"
  1733.      Gosub Treasure.Bonus ' bonus for last staff
  1734.    Endif
  1735.  Endif
  1736.  Return ' exit routine
  1737.  
  1738. ' find a ring
  1739. Ring:
  1740.  dungeonrec.dat(xco,yco)=46 ' reset dungeon cell to dungeon dot
  1741.  Color 14 ' ansi color
  1742.  a$="You find a ring!(5 to take or 9 to ignore)"
  1743.  Gosub Display.Message ' output message
  1744.  Do ' get a keystroke
  1745.    Gosub Get.Keystroke
  1746.  Loop Until x=5 Or x=9
  1747.  ' presses enter/5 to take ring
  1748.  If x=5 Then 
  1749.    rand=Int(Rnd*10+1) ' select a random ring from 10
  1750.    Restore Ring.Data ' restore data pointer to ring data
  1751.    For i=1 To rand ' read up to random ring number
  1752.      Read b$, x ' ring name, spell number
  1753.    Next
  1754.    a=userrec.ring(rand) ' get ring array number
  1755.    If a Then ' if ring exists in inventory
  1756.      Color 10 ' ansi color
  1757.      a$="You already have a ring of "+b$+"!" ' make display message
  1758.    Else
  1759.      Color 13 ' ansi color
  1760.      a$="You now have a ring of "+b$+"!" ' make display message
  1761.      userrec.ring(rand)=Int(Rnd*3+2) ' set ring array number random charges
  1762.    Endif
  1763.    Gosub Display.Message ' output message
  1764.    Gosub Pause.Second ' wait
  1765.  Endif
  1766.  ' determine existing rings in dungeon level
  1767.  dungeonrec.stats(31)=dungeonrec.stats(31)-1 ' decrement dungeon level ring
  1768.  If dungeonrec.stats(31)=0 Then ' player has taken last ring
  1769.    If dungeonrec.stats(32)=0 Then
  1770.      dungeonrec.stats(32)=1 ' set all dungeon level ring flag
  1771.      d$="rings"
  1772.      Gosub Treasure.Bonus ' bonus for last ring
  1773.    Endif
  1774.  Endif
  1775.  Return ' exit routine
  1776.  
  1777. ' calculate path for player to evade monster in nearby cell
  1778. Evade.Monster:
  1779.  Do ' loop until empty cell to move player
  1780.    For k=1 To Int(Rnd*2+2) ' move player random times
  1781.      c=0 ' loop counter
  1782.      Do ' find empty cell
  1783.        c=c+1 ' increment counter
  1784.        If c>10 Then ' avoid infinite loop
  1785.          Exit For ' exit routine
  1786.        Endif
  1787.        cxco=xco ' store temporary x-coordinate
  1788.        cyco=yco ' store temporary y-coordinate
  1789.        Gosub Get.Random.Direction ' get valid random direction
  1790.        If Coor.Direction Then ' returned valid random direction
  1791.          If dungeonrec.dat(xco+xo,yco+yo)=46 Then ' empty dungeon cell
  1792.            Exit Do ' found empty cell at random direction
  1793.          Endif
  1794.        Endif
  1795.      Loop 
  1796.      ' move to selected cell
  1797.      xco=xco+xo ' increment players x coordinate
  1798.      yco=yco+yo ' increment players y coordinate
  1799.      Gosub Update.Player ' update nearby cell actions
  1800.    Next ' get next evade move
  1801.    If dungeonrec.dat(xco,yco)=46 Then ' move to an dungeon dot
  1802.      Exit Do ' end move player
  1803.    Endif
  1804.  Loop
  1805.  Return ' exit routine
  1806.  
  1807. ' player attacks all nearby monsters at all coordinates
  1808. Attack.Nearby.Monsters:
  1809.  For mxco=xco-1 To xco+1
  1810.    For myco=yco-1 To yco+1
  1811.      If mxco>1 And mxco<23 Then
  1812.        If myco>1 And myco<79 Then
  1813.          Gosub Attack.Monster
  1814.        Endif
  1815.      Endif
  1816.    Next
  1817.  Next
  1818.  Return
  1819.  
  1820. ' player attacks a nearby monster at coordinates mxco, myco
  1821. Attack.Monster:
  1822.  Gosub Update.Counters ' reset any increment counters to do with monsters
  1823.  f=0 ' attack monster flag
  1824.  For mn=1 To 8 ' loop through each of eight monsters in surrounding cells
  1825.    If monsters(mn,1)=mxco And monsters(mn,2)=myco Then ' select monster coor.
  1826.      f=1
  1827.      Exit For
  1828.    Endif
  1829.  Next
  1830.  If f=0 Then ' no monster found
  1831.    Return ' exit routine
  1832.  Endif
  1833.  x=userrec.stats2(5)+userrec.stats2(12) ' dexterity plus boots
  1834.  y=Int(Rnd*(20+monsters(mn,3))) ' miss monster equation
  1835.  If y>x Then ' misses monster
  1836.    Color 12 ' ansi color
  1837.    a$="You missed!" ' make display message
  1838.    Gosub Display.Message ' output message
  1839.    Gosub Pause.Second ' wait
  1840.    Return ' exit routine
  1841.  Endif
  1842.  ran!=Rnd ' calculate bonus to hit monster by random percentage
  1843.  If ran!>.96 Then ' random hit one,
  1844.    bonus=4 ' high hit bonus
  1845.  Else
  1846.    If ran!>.91 Then ' random hit two,
  1847.      bonus=3 ' normal hit bonus
  1848.    Else
  1849.      If ran!>.86 Then ' random hit three
  1850.        bonus=2 ' low hit bonus
  1851.      Else
  1852.        bonus=1 ' no hit bonus
  1853.      Endif
  1854.    Endif
  1855.  Endif
  1856.  ' calculate hits on monster
  1857.  hits#=Rnd*(userrec.stats2(1)+stp)+userrec.stats1(2)/2
  1858.  hits#=hits#*bonus+userrec.stats2(7)+dlvl#
  1859.  hits#=int(hits#)
  1860.  If hits#<=0 Then ' zero hits misses
  1861.    Color 12 ' ansi color
  1862.    a$="You missed!" ' make display message
  1863.    Gosub Display.Message ' output message
  1864.    Gosub Pause.Second ' wait
  1865.    Return ' exit routine
  1866.  Endif
  1867.  Color 14 ' ansi color
  1868.  ' make display message with monster name and hits on monster
  1869.  a$="You hit the "+monstername(monsters(mn,6))+" for"+Str$(hits#)+" hits!"
  1870.  If slp Then ' sleep flag
  1871.    a$=a$+" It's helpless!"
  1872.  Endif
  1873.  Gosub Display.Message ' output message
  1874.  Gosub Pause.Second ' wait
  1875.  monsters(mn,4)=monsters(mn,4)-hits# ' decrement monsters hits
  1876.  If monsters(mn,4)>0 Then ' monsters hits below zero, monster died,
  1877.    Return ' exit routine
  1878.  Endif
  1879.  ex#=monsters(mn,5) ' get experience
  1880.  Gosub Update.Stats ' add to players statistics
  1881.  dungeonrec.dat(mxco,myco)=46 ' reset dungeon cell to dungeon dot
  1882.  monsters(mn,1)=0 ' clear monster x-coordinate
  1883.  monsters(mn,2)=0 ' clear monster y=coordinate
  1884.  Color 15 ' ansi color
  1885.  Locate mxco,myco,0 ' position cursor
  1886.  Print "$"; ' make $ at dead monster cell
  1887.  ' select coin type
  1888.  ran!=Rnd ' based on percentage
  1889.  If ran!>.85 Then
  1890.    bonus=8 ' multiplier
  1891.    b$="platinum" ' coin name
  1892.  Else
  1893.    If ran!>.75 Then
  1894.      bonus=5 ' multiplier
  1895.      b$="gold" ' coin name
  1896.    Else
  1897.      If ran!>.50 Then
  1898.        bonus=3 ' multiplier
  1899.        b$="silver" ' coin name
  1900.      Else
  1901.        bonus=2 ' multiplier
  1902.        b$="copper" ' coin name
  1903.      Endif
  1904.    Endif
  1905.  Endif
  1906.  ' make display message with monster killed and coins found
  1907.  Color 14 ' ansi color
  1908.  a$="You killed the "+monstername(monsters(mn,6))+"!"
  1909.  a$=a$+" On it is some "+b$+"!(5 to take or 9 to ignore)"
  1910.  Gosub Display.Message ' output message
  1911.  Do ' get a keystroke
  1912.    Gosub Get.Keystroke
  1913.  Loop Until x=5 Or x=9
  1914.  ' presses enter/5 to take coins
  1915.  If x=5 Then
  1916.    temp#=Rnd*monsters(mn,4)
  1917.    temp#=temp#+Rnd*monsters(mn,5)+10
  1918.    temp#=Int(temp#*bonus*10)
  1919.    userrec.stats1(5)=userrec.stats1(5)+temp#
  1920.  Endif
  1921.  If Rnd>.5 Then ' 50/50 find some gems
  1922.    Color 15 ' ansi color
  1923.    Locate mxco,myco,0 ' position cursor
  1924.    Print "*"; ' select gem type
  1925.    ran!=Rnd ' based on percentage
  1926.    If ran!>.85 Then
  1927.      bonus=8 ' multiplier
  1928.      b$="diamonds" ' gem name
  1929.    Else
  1930.      If ran!>.75 Then
  1931.        bonus=5 ' multiplier
  1932.        b$="emeralds" ' gem name
  1933.      Else
  1934.        If ran!>.50 Then
  1935.          bonus=3 ' multiplier
  1936.          b$="saphires" ' gem name
  1937.        Else
  1938.          bonus=2' multiplier
  1939.          b$="rubies" ' gem name
  1940.        Endif
  1941.      Endif
  1942.    Endif
  1943.    Color 14 ' ansi color
  1944.    ' make display message with gem type found
  1945.    a$="You find some "+b$+"!(5 to take or 9 to ignore)"
  1946.    Gosub Display.Message ' output message
  1947.    Do ' get a keystroke
  1948.      Gosub Get.Keystroke
  1949.    Loop Until x=5 Or x=9
  1950.    ' presses enter/5 to take gems
  1951.    If x=5 Then
  1952.      temp#=Rnd*monsters(mn,4)
  1953.      temp#=temp#+Rnd*monsters(mn,5)+10
  1954.      temp#=Int(temp#*bonus)
  1955.      userrec.stats1(5)=userrec.stats1(5)+temp#
  1956.    Endif
  1957.  Endif
  1958.  If Rnd>.75 Then ' 3/4 percent chance for chest
  1959.    Color 15 ' ansi color
  1960.    Locate mxco,myco,0 ' position cursor
  1961.    Print Chr$(254); ' chest symbol
  1962.    Gosub Chest ' open the chest
  1963.  Endif
  1964.  Color 7 ' ansi color
  1965.  Locate mxco,myco,0 ' position cursor
  1966.  Print "."; ' display dungeon dot
  1967.  dungeonrec.stats(6)=dungeonrec.stats(6)-1 ' decrement dungeon level monsters
  1968.  If dungeonrec.stats(6)=0 Then ' last monster
  1969.    If dungeonrec.stats(5)=0 Then ' all dungeon level monsters flags
  1970.      dungeonrec.stats(5)=1 ' set all dungeon level monsters flag
  1971.      ' calculate experience gained for last monster killed
  1972.      ex#=(Rnd*dlvl#*2+1)*userrec.stats1(2)^2/2
  1973.      ex#=ex#+dlvl#*2+Rnd*userrec.stats1(2)*50
  1974.      ex#=Int(ex#)
  1975.      Color 14 ' ansi color
  1976.      a$="You killed all the monsters on this level! You gain"
  1977.      a$=a$+Str$(ex#)+" experience!"
  1978.      Gosub Display.Message ' output message
  1979.      Gosub Update.Stats ' add to players statistics
  1980.      Gosub Pause.Second ' wait
  1981.    Endif
  1982.  Endif
  1983.  Return ' exit routine
  1984.  
  1985. ' reset/increment any counters
  1986. Update.Counters:
  1987.  shpc=shpc-1 ' decrement shield counter
  1988.  If shpc<0 Then ' check shield counter
  1989.    shp=0 ' reset shield amount
  1990.    shpc=0 ' reset shield counter
  1991.  Endif
  1992.  mhpmc=mhpmc-1 'decrement monster hit point minus counter
  1993.  If mhpmc<0 Then ' check monster hit point minus counter
  1994.    mhpm=0 ' reset monster hit point minus amount
  1995.    mhpmc=0 ' reset monster hit point minus counter
  1996.  Endif
  1997.  slpc=slpc-1 ' decrement sleep counter
  1998.  If slpc<0 Then ' check sleep counter
  1999.    slp=0 ' reset sleep flag
  2000.    slpc=0 ' reset sleep counter
  2001.  Endif
  2002.  stpc=stpc-1 ' decrement strength counter
  2003.  If stpc<0 Then ' check strength counter
  2004.    stp=0 ' reset strength amount
  2005.    stpc=0 ' reset strength counter
  2006.  Endif
  2007.  pwc=pwc-1 ' decrement pass monsters counter
  2008.  If pwc<0 Then ' check pass monsters counter
  2009.    pw=0 ' reset pass monsters flag
  2010.    pwc=0 ' reset pass monsters counter
  2011.  Endif
  2012.  If pw=1 Then ' check pass monsters flag
  2013.    slp=1 ' set sleep flag
  2014.    slpc=1 ' set sleep counter
  2015.  Endif
  2016.  Return ' exit routine
  2017.  
  2018. ' find a trap
  2019. Trap:
  2020.  dungeonrec.dat(xco,yco)=46 ' reset cell to dungeon dot
  2021.  Color 31 ' ansi color
  2022.  Locate xco,yco,0 ' position cursor
  2023.  Print "^"; ' display a blinking trap where the character X is
  2024.  Color 11 ' ansi color
  2025.  a$="You triggered a trap! " ' message to display in hit.player routine
  2026.  mhp#=0 ' reset monster hit points to zero, then
  2027.  Gosub Hit.Player ' hit player will calculate hits from trap
  2028.  dungeonrec.stats(9)=dungeonrec.stats(9)-1 ' decrement dungeon level trap counter
  2029.  If dungeonrec.stats(9)=0 Then ' player has triggered the last trap
  2030.    If dungeonrec.stats(10)=0 Then
  2031.      dungeonrec.stats(10)=1 ' set all dungeon level trap flag
  2032.    Endif
  2033.  Endif
  2034.  Return ' exit routine
  2035.  
  2036. ' find a pit
  2037. Pit:
  2038.  dungeonrec.dat(xco,yco)=46 ' reset cell to dungeon dot
  2039.  Color 31 ' ansi color
  2040.  Locate xco,yco,0 ' position cursor
  2041.  Print "o"; ' display a blinking pit where the character X is
  2042.  Color 11 ' ansi color
  2043.  a$="You fell in a pit! " ' message to display in hit.player routine
  2044.  mhp#=0 ' reset monster hit points to zero, then
  2045.  Gosub Hit.Player ' hit player will calculate hits from pit
  2046.  dungeonrec.stats(13)=dungeonrec.stats(13)-1 ' decrement dungeon level pit counter
  2047.  If dungeonrec.stats(13)=0 Then ' player has fallen in the last pit
  2048.    If dungeonrec.stats(14)=0 Then
  2049.      dungeonrec.stats(14)=1 ' set all dungeon level pit flag
  2050.    Endif
  2051.  Endif
  2052.  Return ' exit routine
  2053.  
  2054. ' open located chest
  2055. Find.Chest:
  2056.  dungeonrec.dat(xco,yco)=46 ' reset cell with dungeon dot
  2057.  Gosub Chest
  2058.  dungeonrec.stats(23)=dungeonrec.stats(23)-1 ' decrement dungeon level chest
  2059.  If dungeonrec.stats(23)=0 Then ' player has opened last chest
  2060.    If dungeonrec.stats(24)=0 Then
  2061.      dungeonrec.stats(24)=1 ' set all dungeon level chest flag
  2062.      d$="chests"
  2063.      Gosub Treasure.Bonus ' bonus for last chest
  2064.    Endif
  2065.  Endif
  2066.  Return ' exit routine
  2067.  
  2068. ' open any chest
  2069. Chest:
  2070.  Color 14 ' ansi color
  2071.  a$="You find a chest!(5 to open or 9 to ignore)"
  2072.  Gosub Display.Message ' output message
  2073.  Do ' get a keystroke
  2074.    Gosub Get.Keystroke
  2075.  Loop Until x=5 Or x=9
  2076.  ' presses enter/5 to open chest
  2077.  If x=5 Then
  2078.    number=Int(Rnd*4+1) ' select random number of chest contents
  2079.    For i=1 To number ' loop through number of contents
  2080.      choice=Int(Rnd*6+1) ' select random treasure in chest
  2081.      Select Case choice ' get treasure name
  2082.      Case 1 ' type 1
  2083.        b$="a weapon"
  2084.      Case 2 ' type 2
  2085.        b$="a shield"
  2086.      Case 3 ' type 3
  2087.        b$="some armor"
  2088.      Case 4 ' type 4
  2089.        b$="a cloak"
  2090.      Case 5 ' type 5
  2091.        b$="a helmet"
  2092.      Case 6 ' type 6
  2093.        b$="some boots"
  2094.      End Select
  2095.      Color 13 ' ansi color
  2096.      a$="In it you find "+b$+"!(5 to take or 9 to ignore)"
  2097.      Gosub Display.Message ' output message
  2098.      Do ' get s keystroke
  2099.        Gosub Get.Keystroke
  2100.      Loop Until x=5 Or x=9
  2101.      ' presses enter/5 to take item
  2102.      If x=5 Then
  2103.        ' calculate bonus of item selected
  2104.        bonus=Int(Rnd*dlvl#*2+1)
  2105.        If bonus>99 Then ' restrict bonus plus of item to 99
  2106.          bonus=99 ' reset to 99 if greater
  2107.        Endif
  2108.        ' select the item, computing variable 'a' equal to;
  2109.        '  zero if the bonus is greater than existing item in inventory,
  2110.        '    and setting the inventory to the bonus, or
  2111.        '  true if the existing item in inventory is greater than the bonus,
  2112.        '    and setting the variable max to the plus of the inventory item.
  2113.        Select Case choice
  2114.        Case 1 ' type weapon
  2115.          If bonus>userrec.stats2(7) Then ' is chest bonus greater?
  2116.            a=0 ' yes,
  2117.            userrec.stats2(7)=bonus ' increase weapon plus;
  2118.          Else
  2119.            a=-1 ' no,
  2120.            max=userrec.stats2(7) ' set max to existing weapon plus.
  2121.          Endif
  2122.        Case 2 ' type shield
  2123.          If bonus>userrec.stats2(8) Then ' is chest bonus greater?
  2124.            a=0 ' yes,
  2125.            userrec.stats2(8)=bonus ' increase shield plus;
  2126.          Else
  2127.            a=-1 ' no,
  2128.            max=userrec.stats2(8) ' set max to existing shield plus.
  2129.          Endif
  2130.        Case 3 ' type armor
  2131.          If bonus>userrec.stats2(9) Then ' is chest bonus greater?
  2132.            a=0 ' yes,
  2133.            userrec.stats2(9)=bonus ' increase armor plus;
  2134.          Else
  2135.            a=-1 ' no,
  2136.            max=userrec.stats2(9) ' set max to existing armor plus.
  2137.          Endif
  2138.        Case 4 ' type cloak
  2139.          If bonus>userrec.stats2(10) Then ' is chest bonus greater?
  2140.            a=0 ' yes,
  2141.            userrec.stats2(10)=bonus ' increase cloak plus;
  2142.          Else
  2143.            a=-1 ' no,
  2144.            max=userrec.stats2(10) ' set max to existing cloak plus.
  2145.          Endif
  2146.        Case 5 ' type helmet
  2147.          If bonus>userrec.stats2(11) Then ' is chest bonus greater?
  2148.            a=0 ' yes,
  2149.            userrec.stats2(11)=bonus ' increase helmet plus;
  2150.          Else
  2151.            a=-1 ' no,
  2152.            max=userrec.stats2(11) ' set max to existing helmet plus.
  2153.          Endif
  2154.        Case 6 ' type boot
  2155.          If bonus>userrec.stats2(12) Then ' is chest bonus greater?
  2156.            a=0 ' yes,
  2157.            userrec.stats2(12)=bonus ' increase boot plus;
  2158.          Else
  2159.            a=-1 ' no,
  2160.            max=userrec.stats2(12) ' set max to existing boot plus.
  2161.          Endif
  2162.        End Select
  2163.        If a Then ' player has the item of greater plus already
  2164.          Color 10 ' ansi color
  2165.          ' make display message for already in inventory
  2166.          a$="You already have "+b$+"(+"+Mid$(Str$(max),2)+")!"
  2167.        Else ' otherwise
  2168.          Color 13 ' ansi color
  2169.          ' make display message with increased plus
  2170.          a$="You now have "+b$+"(+"+Mid$(Str$(bonus),2)+")!"
  2171.        Endif
  2172.        Gosub Display.Message ' output message
  2173.        Gosub Pause.Second ' wait
  2174.      Endif
  2175.    Next
  2176.    If Rnd>.99 Then ' 1 percent chance of chest containing a globe of power
  2177.      If dungeonrec.stats(1)=0 Then ' if this dungeon level has not had one yet
  2178.        If userrec.stats2(17)=0 Then ' and if the player does not have a globe
  2179.          dungeonrec.stats(1)=1 ' set dungeon level globe flag
  2180.          userrec.stats2(17)=1 ' set player globe flag
  2181.          For i=1 to 10 ' loop through globe array
  2182.            userrec.globe(i)=0 ' set usage flag for each
  2183.          Next ' globe power to zero.
  2184.          Color 31 ' ansi color
  2185.          a$="In it you find The Globe of Power!" ' make display message
  2186.          Gosub Display.Message ' output message
  2187.          Gosub Pause.Second ' wait
  2188.          Color 7 ' ansi color
  2189.        Endif
  2190.      Endif
  2191.    Endif
  2192.  Endif
  2193.  Return ' exit routine
  2194.  
  2195. ' use a power of the globe
  2196. Use.Globe:
  2197.  If userrec.stats2(17)=0 Then ' check if player has the globe
  2198.    Color 13 ' ansi color
  2199.    a$="You do not have The Globe of Power!" ' make display message
  2200.    Gosub Display.Message ' output message
  2201.    Return ' exit routine
  2202.  Endif
  2203.  If userrec.globe(i)=1 Then ' if globe power in variable i has been used,
  2204.    Color 13 ' ansi color
  2205.    a$="This Globe Power is depleted!" ' make display message
  2206.    Gosub Display.Message ' output message
  2207.    Return ' exit routine
  2208.  Endif
  2209.  userrec.globe(i)=1 ' set globe power variable i flag to used
  2210.  Select Case i ' select globe power variable i 1 to 10
  2211.  Case 1 ' replenish level
  2212.    Color 13 ' ansi color
  2213.    a$="The dungeon becomes replenished!" ' make display message
  2214.    Gosub Display.Message ' output message
  2215.    Gosub Pause.Second ' wait
  2216.    Gosub Zero.Dungeon ' first remove all dungeon treasure,
  2217.    Gosub Replenish.Dungeon ' then replenish dungeon level treasure
  2218.  Case 2 ' down 10 levels
  2219.    Gosub Store.Dungeon.Level ' record the dungeon statistics and screen
  2220.    dlvl#=dlvl#+10 ' increment players dungeon level counter
  2221.    ' check if player has entered a dungeon level lower than his last recorded
  2222.    If dlvl#>userrec.stats1(1) Then ' if lower,
  2223.      userrec.stats1(1)=dlvl# ' set players maximum dungeon level to current level
  2224.    Endif
  2225.    Gosub Next.Dungeon.Level ' load dungeon level statistics
  2226.    Gosub Cell.Action ' compute nearby cells
  2227.  Case 3 ' up 10 levels
  2228.    Gosub Store.Dungeon.Level ' record the dungeon statistics and screen
  2229.    For dt=1 to 10 ' count up 10 levels
  2230.      Gosub Decrement.Dungeon.Level ' subtract one from dungeon level variable
  2231.      If dlvl#=0 Then ' exited the dungeon
  2232.        Return ' exit routine
  2233.      Endif
  2234.    Next
  2235.    Gosub Next.Dungeon.Level ' load dungeon level statistics
  2236.    Gosub Cell.Action ' compute nearby cells
  2237.  Case 4 ' collect all
  2238.    Color 13 ' ansi color
  2239.    a$="You now have all treasure!" ' make display message
  2240.    Gosub Display.Message ' output message
  2241.    Gosub Pause.Second ' wait
  2242.    For j=1 to 10 ' set all inventory
  2243.      userrec.wand(j)=Int(Rnd*3+2) ' charges randomly
  2244.      userrec.potion(j)=Int(Rnd*3+2)
  2245.      userrec.staff(j)=Int(Rnd*3+2)
  2246.      userrec.ring(j)=Int(Rnd*3+2)
  2247.    Next
  2248.  Case 5 ' use all wands
  2249.    gdc=0 ' reset extended monster cell death counter
  2250.    For j=1 to 10 ' add up all wand charges
  2251.      gdc=gdc+userrec.wand(j) ' to increment extended monster cell death counter
  2252.      userrec.wand(j)=0 ' reset wands charges to zero
  2253.    Next
  2254.    If gdc>0 Then ' if any charges added,
  2255.      gd=1 ' set extended monster cell death flag
  2256.      Color 13 ' ansi color
  2257.      a$="You use all wands! They vanished!" ' make display message
  2258.      Gosub Display.Message ' output message
  2259.      Gosub Pause.Second ' wait
  2260.      Gosub Cell.Monster.Attack ' all nearby monsters die
  2261.    Else
  2262.      gd=0 ' reset extended monster cell death flag
  2263.      Color 13 ' ansi color
  2264.      a$="You have no wands!" ' make display message
  2265.      Gosub Display.Message ' output message
  2266.      Gosub Pause.Second ' wait
  2267.    Endif
  2268.  Case 6 ' use all potions
  2269.    gdc=0 ' reset extended monster cell death counter
  2270.    For j=1 to 10 ' add up all potion charges
  2271.      gdc=gdc+userrec.potion(j) ' to increment extended monster cell death counter
  2272.      userrec.potion(j)=0 ' reset potion charges to zero
  2273.    Next
  2274.    If gdc>0 Then ' if any charges added,
  2275.      gd=1 ' set extended monster cell death flag
  2276.      Color 13 ' ansi color
  2277.      a$="You use all potions! They vanished!" ' make display message
  2278.      Gosub Display.Message ' output message
  2279.      Gosub Pause.Second ' wait
  2280.      Gosub Cell.Monster.Attack ' all nearby monsters die
  2281.    Else
  2282.      gd=0 ' set extended monster cell death flag
  2283.      Color 13 ' ansi color
  2284.      a$="You have no potions!" ' make display message
  2285.      Gosub Display.Message ' output message
  2286.      Gosub Pause.Second ' wait
  2287.    Endif
  2288.  Case 7 ' use all staffs
  2289.    gdc=0 ' reset extended monster cell death counter
  2290.    For j=1 to 10 ' add up all staff charges
  2291.      gdc=gdc+userrec.staff(j) ' to increment extended monster cell death counter
  2292.      userrec.staff(j)=0 ' reset staff charges to zero
  2293.    Next
  2294.    If gdc>0 Then ' if any charges added,
  2295.      gd=1 ' set extended monster cell death flag
  2296.      Color 13 ' ansi color
  2297.      a$="You use all staffs! They vanished!" ' make display message
  2298.      Gosub Display.Message ' output message
  2299.      Gosub Pause.Second ' wait
  2300.      Gosub Cell.Monster.Attack ' all nearby monsters die
  2301.    Else
  2302.      gd=0 ' reset extended monster cell death flag
  2303.      Color 13 ' ansi color
  2304.      a$="You have no staffs!" ' make display message
  2305.      Gosub Display.Message ' output message
  2306.      Gosub Pause.Second ' wait
  2307.    Endif
  2308.  Case 8 ' use all rings
  2309.    gdc=0 ' reset extended monster cell death counter
  2310.    For j=1 to 10 ' add up all ring charges
  2311.      gdc=gdc+userrec.ring(j) ' to increment extended monster cell death counter
  2312.      userrec.ring(j)=0 ' reset ring charges to zero
  2313.    Next
  2314.    If gdc>0 Then ' if any charges added,
  2315.      gd=1 ' set extended monster cell death flag
  2316.      Color 13 ' ansi color
  2317.      a$="You use all rings! They vanished!" ' make display message
  2318.      Gosub Display.Message ' output message
  2319.      Gosub Pause.Second ' wait
  2320.      Gosub Cell.Monster.Attack ' all nearby monsters die
  2321.    Else
  2322.      gd=0 ' reset extended monster cell death flag
  2323.      Color 13 ' ansi color
  2324.      a$="You have no rings!" ' make display message
  2325.      Gosub Display.Message ' output message
  2326.      Gosub Pause.Second ' wait
  2327.    Endif
  2328.  Case 9 ' trade all
  2329.    k=0 ' set counter to add all inventry charges
  2330.    For j=1 to 10 ' add all
  2331.      k=k+userrec.wand(j) ' wand charges,
  2332.      userrec.wand(j)=0 ' set wands to zero
  2333.      k=k+userrec.potion(j) ' potion charges,
  2334.      userrec.potion(j)=0 ' set potions to zero
  2335.      k=k+userrec.staff(j) ' staff charges,
  2336.      userrec.staff(j)=0 ' set staffs to zero
  2337.      k=k+userrec.ring(j) ' ring charges,
  2338.      userrec.ring(j)=0 ' set to zero
  2339.    Next
  2340.    k=Int(k/6) ' average for increase to each statistic
  2341.    userrec.stats2(1)=userrec.stats2(1)+k ' add average to strength
  2342.    If userrec.stats2(1)>99 Then ' check limit,
  2343.      userrec.stats2(1)=99 ' set to maximum
  2344.    Endif
  2345.    userrec.stats2(2)=userrec.stats2(2)+k ' add average to intelligence
  2346.    If userrec.stats2(2)>99 Then ' check limit,
  2347.      userrec.stats2(2)=99 ' set to maximum
  2348.    Endif
  2349.    userrec.stats2(3)=userrec.stats2(3)+k ' add average to wisdom
  2350.    If userrec.stats2(3)>99 Then ' check limit,
  2351.      userrec.stats2(3)=99 ' set to maximum
  2352.    Endif
  2353.    userrec.stats2(4)=userrec.stats2(4)+k ' add average to constitution
  2354.    If userrec.stats2(4)>99 Then 'check limit,
  2355.      userrec.stats2(4)=99 ' set to maximum
  2356.    Endif
  2357.    userrec.stats2(5)=userrec.stats2(5)+k ' add average to dexterity
  2358.    If userrec.stats2(5)>99 Then ' check to limit,
  2359.      userrec.stats2(5)=99 ' set to maximum
  2360.    Endif
  2361.    userrec.stats2(6)=userrec.stats2(6)+k ' add average to charisma
  2362.    If userrec.stats2(6)>99 Then ' check to limit,
  2363.      userrec.stats2(6)=99 ' set to maximum
  2364.    Endif
  2365.    userrec.stats2(7)=userrec.stats2(7)+k ' add average to weapon
  2366.    If userrec.stats2(7)>99 Then ' check limit,
  2367.      userrec.stats2(7)=99 ' set to maximum
  2368.    Endif
  2369.    userrec.stats2(8)=userrec.stats2(8)+k ' add average to shield
  2370.    If userrec.stats2(8)>99 Then ' check limit,
  2371.      userrec.stats2(8)=99 ' set to maximum
  2372.    Endif
  2373.    userrec.stats2(9)=userrec.stats2(9)+k ' add average to armor
  2374.    If userrec.stats2(9)>99 Then ' check limit,
  2375.      userrec.stats2(9)=99 ' set to maximum
  2376.    Endif
  2377.    userrec.stats2(10)=userrec.stats2(10)+k ' add average to cloak
  2378.    If userrec.stats2(10)>99 Then ' check to limit,
  2379.      userrec.stats2(10)=99 ' set to maximum
  2380.    Endif
  2381.    userrec.stats2(11)=userrec.stats2(11)+k ' add average to helmet
  2382.    If userrec.stats2(11)>99 Then ' check to limit,
  2383.      userrec.stats2(11)=99 ' set to maximum
  2384.    Endif
  2385.    userrec.stats2(12)=userrec.stats2(12)+k ' add average to boots
  2386.    If userrec.stats2(12)>99 Then 'check limit,
  2387.      userrec.stats2(12)=99 ' set to maximum
  2388.    Endif
  2389.    Color 13 ' ansi color
  2390.    a$="You trade all treasure! They vanished!" ' make display message
  2391.    Gosub Display.Message ' output message
  2392.    Gosub Pause.Second ' wait
  2393.    Gosub Extended.Status.Line
  2394.  Case 10 ' clear level
  2395.    dungeonrec.stats(4)=1 ' set cleared dungeon flag
  2396.    Gosub Dungeon.Worth ' total all dungeon treasure
  2397.    Gosub Zero.Dungeon ' clear all dungeon level treasure
  2398.    Color 13 ' ansi color
  2399.    a$="You now have"+Str$(userrec.stats1(5))+" gold!" ' make display message
  2400.    Gosub Display.Message ' output message
  2401.    Gosub Pause.Second ' wait
  2402.  End Select
  2403.  For j=1 to 10 ' loop through globe power usage flag array
  2404.    If userrec.globe(j)=0 Then ' remaining globe power
  2405.      Return ' exit routine
  2406.    Endif
  2407.  Next
  2408.  userrec.stats2(17)=0 ' reset player globe flag
  2409.  Color 13 ' ansi color
  2410.  a$="The Globe of Power is depleted!" ' make display message
  2411.  Gosub Display.Message ' output message
  2412.  Gosub Pause.Second ' wait
  2413.  Return ' exit routine
  2414.  
  2415. ' increase experience and reset players statistics
  2416. Update.Stats:
  2417.  userrec.stats1(3)=userrec.stats1(3)+ex# ' increase experience
  2418.  If userrec.stats1(2)=99 Then ' check valid player level
  2419.    Return ' exit routine
  2420.  Endif
  2421.  x#=userrec.stats1(2)+6
  2422.  y#=2^x#
  2423.  If userrec.stats1(3)<y# Then ' check sufficient experience
  2424.    Return ' exit routine
  2425.  Endif
  2426.  x#=userrec.stats1(2)
  2427.  y#=2^x#
  2428.  If userrec.stats1(5)<y# Then ' and gold to reach next level
  2429.    Return ' exit routine
  2430.  Endif
  2431.  userrec.stats1(5)=userrec.stats1(5)-y# ' decrease gold for new level
  2432.  ' increase players maximum hit points by constitution
  2433.  userrec.stats1(6)=userrec.stats1(6)+userrec.stats2(4)
  2434.  userrec.stats1(4)=userrec.stats1(6) ' set players hit points
  2435.  userrec.stats1(2)=userrec.stats1(2)+1 ' increment players level
  2436.  x=userrec.stats1(2)*10 ' set players spell points
  2437.  userrec.stats2(13)=x
  2438.  userrec.stats2(14)=x
  2439.  userrec.stats2(15)=x
  2440.  userrec.stats2(16)=x
  2441.  Return ' exit routine
  2442.  
  2443. ' display additional players statistics at row 25
  2444. Extended.Status.Line:
  2445.  x=0 ' line length counter
  2446.  Locate 25,1,0 ' position cursor
  2447.   ' strength
  2448.  Color 12 ' ansi color
  2449.  Print "STR"; ' display strength
  2450.  x=x+3 ' length of line
  2451.  Color 15 ' ansi color
  2452.  a$=Str$(userrec.stats2(1))+" " ' append strength
  2453.  x=x+Len(a$) ' increment line length
  2454.  Print a$; ' display strength
  2455.  ' intelligence
  2456.  Color 12 ' ansi color
  2457.  Print "INT"; ' display intelligence
  2458.  x=x+3 ' length of line
  2459.  Color 15 ' ansi color
  2460.  a$=Str$(userrec.stats2(2))+" " ' append intelligence
  2461.  x=x+Len(a$) ' increment line length
  2462.  Print a$; ' display intelligence
  2463.  ' wisdom
  2464.  Color 12 ' ansi color
  2465.  Print "WIS"; ' display wisdom
  2466.  x=x+3 ' length of line
  2467.  Color 15 ' ansi color
  2468.  a$=Str$(userrec.stats2(3))+" " ' append wisdom
  2469.  x=x+Len(a$) ' increment line length
  2470.  Print a$; ' display wisdom
  2471.  ' constitution
  2472.  Color 12 ' ansi color
  2473.  Print "CON"; ' display constitution
  2474.  x=x+3 ' length of line
  2475.  Color 15 ' ansi color
  2476.  a$=Str$(userrec.stats2(4))+" " ' append constitution
  2477.  x=x+Len(a$) ' increment line length
  2478.  Print a$; ' display constitution
  2479.  ' dexterity
  2480.  Color 12 ' ansi color
  2481.  Print "DEX"; ' display dexterity
  2482.  x=x+3 ' length of line
  2483.  Color 15 ' ansi color
  2484.  a$=Str$(userrec.stats2(5))+" " ' append dexterity
  2485.  x=x+Len(a$) ' increment line length
  2486.  Print a$; ' display dexterity
  2487.  ' charisma
  2488.  Color 12 ' ansi color
  2489.  Print "CHA"; ' display charisma
  2490.  x=x+3 ' length of line
  2491.  Color 15 ' ansi color
  2492.  a$=Str$(userrec.stats2(6))+" " ' append charisma
  2493.  x=x+Len(a$) ' increment line length
  2494.  Print a$; ' display charisma
  2495.  ' weapon plus
  2496.  Color 14 ' ansi color
  2497.  Print "WE"; ' display weapon plus
  2498.  x=x+2 ' length of line
  2499.  Color 15 ' ansi color
  2500.  a$=Str$(userrec.stats2(7))+" " ' append weapon plus
  2501.  x=x+Len(a$) ' increment length of line
  2502.  Print a$; ' display weapon plus
  2503.  ' shield plus
  2504.  Color 14 ' ansi color
  2505.  Print "SH"; ' display shield plus
  2506.  x=x+2 ' length of line
  2507.  Color 15 ' ansi color
  2508.  a$=Str$(userrec.stats2(8))+" " ' append shield plus
  2509.  x=x+Len(a$) ' increment length of line
  2510.  Print a$; ' display shield plus
  2511.  ' armor plus
  2512.  Color 14 ' ansi color
  2513.  Print "AR"; ' display armor plus
  2514.  x=x+2 ' length of line
  2515.  Color 15 ' ansi color
  2516.  a$=Str$(userrec.stats2(9))+" " ' append armor plus
  2517.  x=x+Len(a$) ' increment length of line
  2518.  Print a$; ' display armor plus
  2519.  ' cloak plus
  2520.  Color 14 ' ansi color
  2521.  Print "CL"; ' display cloak plus
  2522.  x=x+2 ' length of line
  2523.  Color 15 ' ansi color
  2524.  a$=Str$(userrec.stats2(10))+" " ' append cloak plus
  2525.  x=x+Len(a$) ' increment length of line
  2526.  Print a$; ' display cloak plus
  2527.  ' helmet plus
  2528.  Color 14 ' ansi color
  2529.  Print "HE"; ' display helmet plus
  2530.  x=x+2 ' length of line
  2531.  Color 15 ' ansi color
  2532.  a$=Str$(userrec.stats2(11))+" " ' append helmet plus
  2533.  x=x+Len(a$) ' increment length of line
  2534.  Print a$; ' display helmet plus
  2535.  ' boot plus
  2536.  Color 14 ' ansi color
  2537.  Print "BO"; ' display boot plus
  2538.  x=x+2 ' length of line
  2539.  Color 15 ' ansi color
  2540.  a$=Str$(userrec.stats2(12)) ' append boot plus
  2541.  x=x+Len(a$) ' increment length of line
  2542.  Print a$; ' display boot plus
  2543.  If x<80 Then ' compare total length of line
  2544.    Print Space$(79-x); ' append blanks
  2545.  Endif
  2546.  Return ' exit routine
  2547.  
  2548. ' display message at row 25
  2549. Display.Message:
  2550.  Locate 25,1,0 ' position cursor
  2551.  a$=Left$(a$,79)
  2552.  Print a$;Space$(79-Len(a$));
  2553.  a$="" ' clear message
  2554.  Return ' exit routine
  2555.  
  2556. ' make players statistics status line at row 24
  2557. Status.Line:
  2558.  ' make first half of status line
  2559.  e$="DLVL"+Str$(dlvl#) ' dungeon level
  2560.  e$=e$+" LVL"+Str$(userrec.stats1(2)) ' players level
  2561.  e$=e$+" HP"+Str$(userrec.stats1(4)) ' players hit points
  2562.  e$=e$+" EXP"+Str$(userrec.stats1(3)) ' experience
  2563.  e$=e$+" GOLD"+Str$(userrec.stats1(5)) ' gold
  2564.  e$=e$+" NM"+Str$(dungeonrec.stats(6))+" " ' number of monsters remaining
  2565.  x=Len(e$) ' calculate length of first half of status line
  2566.  ' make second half of status line
  2567.  f$="SP" ' spell numbers
  2568.  For i=13 To 16 ' spell level points left
  2569.    f$=f$+Str$(userrec.stats2(i)) ' append spell level points
  2570.  Next
  2571.  y=Len(f$) ' calculate length of second half of status line
  2572.  ' remake first half of status line with ansi codes
  2573.  Locate 24,1,0 ' position cursor
  2574.  Color 12 ' ansi color
  2575.  Print "DLVL"; ' dungeon level
  2576.  Color 15 ' ansi color
  2577.  Print Str$(dlvl#);" ";
  2578.  Color 12 ' ansi color
  2579.  Print "LVL"; ' players level
  2580.  Color 15 ' ansi color
  2581.  Print Str$(userrec.stats1(2));" "; ' players level
  2582.  Color 14 ' ansi color
  2583.  Print "HP"; ' players hit points
  2584.  Color 15 ' ansi color
  2585.  Print Str$(userrec.stats1(4));" "; ' players hit points
  2586.  Color 14 ' ansi color
  2587.  Print "EXP"; ' experience
  2588.  Color 15 ' ansi color
  2589.  Print Str$(userrec.stats1(3));" "; ' players experience
  2590.  Color 10 ' ansi color
  2591.  Print "GOLD"; ' gold
  2592.  Color 15 ' ansi color
  2593.  Print Str$(userrec.stats1(5));" "; ' players gold
  2594.  Color 10 ' ansi color
  2595.  Print "NM"; ' number of monsters remaining
  2596.  Color 15 ' ansi color
  2597.  Print Str$(dungeonrec.stats(6));" "; ' monsters remaining
  2598.  If (x+y)<80 Then ' if both halfs of status line can be displayed
  2599.    Color 11 ' ansi color
  2600.    Print "SP"; ' spell level points remaining
  2601.    Color 15 ' ansi color
  2602.    For i=13 To 16 ' spell level points left
  2603.      Print Str$(userrec.stats2(i)); ' display spell level points
  2604.    Next
  2605.    Print Space$(79-x-y); ' append blanks
  2606.    Return ' exit routine
  2607.  Endif
  2608.  Print Space$(79-x); ' append blanks
  2609.  Return ' exit routine
  2610.  
  2611. ' pause after displaying a message
  2612. Pause.Second:
  2613.  tim!=Timer+.5 ' increase variable half a second beyond timer
  2614.  While Timer<tim! ' loop until timer equals variable
  2615.  Wend
  2616.  Return ' exit routine
  2617.  
  2618. ' retreives a key entered from the keyboard
  2619. Get.Keystroke:
  2620.  x=0
  2621.  Do ' loop until valid key
  2622.    x$="" ' get keystroke
  2623.    While x$="" ' wait for input
  2624.      x$=Inkey$ ' get keystroke
  2625.    Wend ' end wait
  2626.    x=Val(x$) ' convert to numeric variable
  2627.    If x Then ' if key is 1 to 9,
  2628.      Exit Do ' exit routine
  2629.    Endif
  2630.    If x$=Chr$(13) Then ' if key is the enter key,
  2631.      x=5 ' set numeric variable to 5
  2632.      Exit Do ' exit routine
  2633.    Endif
  2634.    If Len(x$)=2 Then ' extended scan code
  2635.       Select Case Asc(Right$(x$,1))
  2636.       Case 79 ' end key
  2637.          x=1 ' set numeric variable to 1
  2638.          Exit Do ' exit routine
  2639.       Case 81 ' page down key
  2640.          x=3 ' set numeric variable to 2
  2641.          Exit Do ' exit routine
  2642.       Case 76 ' center key (enter)
  2643.          x=5 ' set numeric variable to 5
  2644.          Exit Do ' exit routine
  2645.       Case 71 ' home key
  2646.          x=7 ' set numeric variable to 7
  2647.          Exit Do ' exit routine
  2648.       Case 73 ' page up key (ignore)
  2649.          x=9 ' set numeric variable to 9
  2650.          Exit Do ' exit routine
  2651.       End Select
  2652.    Endif
  2653.    If pwl=1 And Len(x$)=2 Then ' passwall has separate input loop
  2654.      Exit Do
  2655.    Endif
  2656.  Loop
  2657.  Return ' exit routine
  2658.  
  2659. ' help function/0 key
  2660. User.List:
  2661.  f$="UTIL.EXE" ' store utility program filename
  2662.  If Dir$(f$)=f$ Then ' verify utility program exists
  2663.    Gosub Store.Dungeon.Level ' store dungeon screen
  2664.    Gosub Put.User.File ' store user record
  2665.    Close ' close all open files
  2666.    Shell f$ ' run utility program
  2667.    Gosub Open.User.File ' reopen user file
  2668.    Gosub Open.Data.File ' reopen data file
  2669.    Gosub Restore.Screen ' redraw dungeon screen
  2670.  Endif ' end verify utility program
  2671.  Return ' exit routine
  2672.  
  2673. ' help function/0 key
  2674. Display.Help:
  2675.  Gosub Store.Dungeon.Level ' store dungeon screen
  2676.  f$="HELP.EXE" ' store help program filename
  2677.  If Dir$(f$)=f$ Then ' verify help program exists
  2678.    Shell f$ ' run help program
  2679.  Else ' help program does not exist
  2680.    Gosub Display.Help.Screen ' display default help screen
  2681.  Endif
  2682.  Gosub Restore.Screen ' redraw dungeon screen
  2683.  Return ' exit routine
  2684.  
  2685. ' display default help screens
  2686. Display.Help.Screen:
  2687.  Color 14, 1 ' blue background
  2688.  Cls ' clear screen
  2689.  Print
  2690.  Print
  2691.  Print "Cursor Keys                         Numeric Keypad       Dungeon Runes"
  2692.  Print
  2693.  Print "End               - fight           1  - fight           X  - your player"
  2694.  Print "Down              - south           2  - south           #  - monster"
  2695.  Print "Page Down         - cast            3  - cast            ~  - scroll"
  2696.  Print "Left              - west            4  - west            $  - gold"
  2697.  Print "Return            - accept          5  - accept          ";Chr$(254);"  - chest"
  2698.  Print "Right             - east            6  - east            ^  - trap"
  2699.  Print "Home              - evade           7  - evade           o  - pit"
  2700.  Print "Up                - north           8  - north           *  - gems"
  2701.  Print "Page Up           - ignore          9  - ignore          !  - teleporter"
  2702.  Print "Insert            - help            0  - help            ?  - temple"
  2703.  Print "Delete            - status line     .  - status line     >  - stairs up"
  2704.  Print "Control-Right     - information     +  - information     <  - stairs down"
  2705.  Print "Control-PageDown  - display chants  -  - display chants  &  - coins"
  2706.  Print "Control-Home      - trade           \  - trade           |  - wand"
  2707.  Print "Control-End       - change level    =  - change level    @  - potion"
  2708.  Print "Control-PageUp    - use item        '  - use item        %  - staff"
  2709.  Print "Control-Left      - inventory       /  - inventory       ";Chr$(34);"  - ring"
  2710.  Print "Shift-Tab         - buy inventory   ;  - buy inventory   ";Chr$(176);"  - dungeon wall";
  2711.  Print "Alt-=             - user list       `  - user list"
  2712.  Gosub Key.Press
  2713.  Color 14, 1 ' blue background
  2714.  Cls ' clear screen
  2715.  Print Space$(10);
  2716.  Print "Spell Level 1  -  Normal          Spell Level 3  -  Shift-"
  2717.  Print Space$(10);
  2718.  Print "F1  - heal                        F1  - regenerate"
  2719.  Print Space$(10);
  2720.  Print "F2  - protection from evil        F2  - forget"
  2721.  Print Space$(10);
  2722.  Print "F3  - magic missile               F3  - lightning bolt"
  2723.  Print Space$(10);
  2724.  Print "F4  - shield                      F4  - phantasmal force"
  2725.  Print Space$(10);
  2726.  Print "F5  - strength                    F5  - wall of force"
  2727.  Print Space$(10);
  2728.  Print "F6  - sleep                       F6  - charm monster"
  2729.  Print Space$(10);
  2730.  Print "F7  - locate                      F7  - continual light"
  2731.  Print Space$(10);
  2732.  Print "F8  - pyrotechnics                F8  - passwall"
  2733.  Print Space$(10);
  2734.  Print "F9  - firestorm                   F9  - demon summon"
  2735.  Print Space$(10);
  2736.  Print "F10 - transmute                   F10 - doomkill"
  2737.  Print
  2738.  Print Space$(10);
  2739.  Print "Spell Level 2  -  Control-        Spell Level 4  -  Alt-"
  2740.  Print Space$(10);
  2741.  Print "F1  - restoration                 F1  - resurrection"
  2742.  Print Space$(10);
  2743.  Print "F2  - scare                       F2  - fear"
  2744.  Print Space$(10);
  2745.  Print "F3  - fireball                    F3  - disintegrate"
  2746.  Print Space$(10);
  2747.  Print "F4  - obscurement                 F4  - blade barrier"
  2748.  Print Space$(10);
  2749.  Print "F5  - power shield                F5  - enchanted weapon"
  2750.  Print Space$(10);
  2751.  Print "F6  - wall of will                F6  - hold monster"
  2752.  Print Space$(10);
  2753.  Print "F7  - light                       F7  - teleport"
  2754.  Print Space$(10);
  2755.  Print "F8  - levitate                    F8  - polymorph"
  2756.  Print Space$(10);
  2757.  Print "F9  - monster summon              F9  - time stop"
  2758.  Print Space$(10);
  2759.  Print "F10 - finger of death             F10 - genocide";
  2760.  Gosub Key.Press
  2761.  Color 14, 1 ' blue background
  2762.  Cls ' clear screen
  2763.  Print Space$(10);
  2764.  Print "Wands                             Staffs"
  2765.  Print Space$(10);
  2766.  Print "Alt-A  - magic missile            Control-A  - locate"
  2767.  Print Space$(10);
  2768.  Print "Alt-B  - pyrotechnics             Control-B  - transmute"
  2769.  Print Space$(10);
  2770.  Print "Alt-C  - firestorm                Control-C  - light"
  2771.  Print Space$(10);
  2772.  Print "Alt-D  - fireball                 Control-D  - levitate"
  2773.  Print Space$(10);
  2774.  Print "Alt-E  - finger of death          Control-E  - continual light"
  2775.  Print Space$(10);
  2776.  Print "Alt-F  - lightning bolt           Control-F  - passwall"
  2777.  Print Space$(10);
  2778.  Print "Alt-G  - doomkill                 Control-G  - fear"
  2779.  Print Space$(10);
  2780.  Print "Alt-H  - disintegrate             Control-H  - enchanted weapon"
  2781.  Print Space$(10);
  2782.  Print "Alt-I  - blade barrier            Control-I  - teleport"
  2783.  Print Space$(10);
  2784.  Print "Alt-J  - genocide                 Control-J  - time stop"
  2785.  Print
  2786.  Print Space$(10);
  2787.  Print "Potions                           Rings"
  2788.  Print Space$(10);
  2789.  Print "Alt-Q  - heal                     Control-Q  - sleep"
  2790.  Print Space$(10);
  2791.  Print "Alt-R  - protection               Control-R  - scare"
  2792.  Print Space$(10);
  2793.  Print "Alt-S  - shield                   Control-S  - obscurement"
  2794.  Print Space$(10);
  2795.  Print "Alt-T  - strength                 Control-T  - monster summon"
  2796.  Print Space$(10);
  2797.  Print "Alt-U  - restoration              Control-U  - forget"
  2798.  Print Space$(10);
  2799.  Print "Alt-V  - power shield             Control-V  - wall of force"
  2800.  Print Space$(10);
  2801.  Print "Alt-W  - wall of will             Control-W  - charm monster"
  2802.  Print Space$(10);
  2803.  Print "Alt-X  - regeneration             Control-X  - demon summon"
  2804.  Print Space$(10);
  2805.  Print "Alt-Y  - phantasmal force         Control-Y  - hold monster"
  2806.  Print Space$(10);
  2807.  Print "Alt-Z  - resurrection             Control-Z  - polymorph";
  2808.  Gosub Key.Press
  2809.  Color 14, 1 ' blue background
  2810.  Cls ' clear screen
  2811.  Print
  2812.  Print
  2813.  Print
  2814.  Print
  2815.  Print
  2816.  Print Space$(15);
  2817.  Print "The Alt-0 to Alt-9 are the Power Globe keys"
  2818.  Print Print
  2819.  Print
  2820.  Print Space$(15);
  2821.  Print "Alt-0 = clear level       Alt-5 = use all wands"
  2822.  Print Space$(15);
  2823.  Print "Alt-1 = replenish level   Alt-6 = use all potions"
  2824.  Print Space$(15);
  2825.  Print "Alt-2 = down 10 levels    Alt-7 = use all staffs"
  2826.  Print Space$(15);
  2827.  Print "Alt-3 = up 10 levels      Alt-8 = use all rings"
  2828.  Print Space$(15);
  2829.  Print "Alt-4 = collect all       Alt-9 = trade all"
  2830.  Print
  2831.  Print Space$(10);
  2832.  Print "There is 1% chance of finding the Power Globe in a chest.";
  2833.  Gosub Key.press
  2834.  Color 7 ' ansi color
  2835.  Return ' exit routine
  2836.  
  2837. ' displays screen of various monster, dungeon level, and player statistics
  2838. Display.Info:
  2839.  Gosub Store.Dungeon.Level ' store dungeon screen
  2840.  Color 14, 1 ' blue background
  2841.  Cls ' clear screen
  2842.  Gosub Info.Screen ' display screen
  2843.  ' display players combined armors plus
  2844.  Locate 13,25,0 ' position cursor
  2845.  x=0
  2846.  For i=8 To 11
  2847.    x=x+userrec.stats2(i)
  2848.  Next
  2849.  Print Str$(x);
  2850.  Locate 14,26,0 ' position cursor
  2851.  Print Str$(userrec.stats2(7)); ' display players weapon plus
  2852.   ' variables store dungeon level minimums, maximums, and averages
  2853.  min.mlvl=0 ' minimum monster level
  2854.  max.mlvl=0 ' monster maximum level
  2855.  tot.mlvl=0 ' monster average level
  2856.  min.hp=0 ' monster minimum hit points
  2857.  max.hp=0 ' monster maximum hit points
  2858.  tot.hp#=0 ' monsters total hit points
  2859.  min.ex=0 ' monsters minimum experience
  2860.  max.ex=0 ' monsters maximum experience
  2861.  tot.ex#=0 ' monsters total experience
  2862.  min.hits=0 ' monsters minimum hits
  2863.  max.hits=0 ' monsters maximum hits
  2864.  tot.hits#=0 ' monsters total hits
  2865.  For i=1 To 10 ' total 10 loops of statistics, calculating minimum and maximum
  2866.    ' random dungeon level monsters level
  2867.    mmlvl=Int(Rnd*dlvl#+dlvl#/2+1)
  2868.    If min.mlvl=0 Then ' set minimum monsters level
  2869.      min.mlvl=mmlvl
  2870.    Endif
  2871.    If mmlvl<min.mlvl Then ' reset minimum monsters level
  2872.      min.mlvl=mmlvl
  2873.    Endif
  2874.    If mmlvl>max.mlvl Then ' reset maximum monsters level
  2875.      max.mlvl=mmlvl
  2876.    Endif
  2877.    tot.mlvl=tot.mlvl+mmlvl ' increase total monster level
  2878.    ' random dungeon level monsters hit points
  2879.    mhp=Int((Rnd*dlvl#*2+1)*mmlvl^2/2+dlvl#*2+Rnd*mmlvl*50)
  2880.    If min.hp=0 Then ' set minimum monsters hit points
  2881.      min.hp=mhp
  2882.    Endif
  2883.    If mhp<min.hp Then ' reset minimum monsters hit points
  2884.      min.hp=mhp
  2885.    Endif
  2886.    If mhp>max.hp Then ' reset maximum monsters hit points
  2887.      max.hp=mhp
  2888.    Endif
  2889.    tot.hp#=tot.hp#+mhp ' increase total monster hit points
  2890.    ' random dungeon level monsters experience
  2891.    mex=Int(mhp/mmlvl)*Int(dlvl#/2+1)+Int(Rnd*mhp)
  2892.    If min.ex=0 Then ' set minimum monsters experience
  2893.      min.ex=mex
  2894.    Endif
  2895.    If mex<min.ex Then ' reset minimum monsters experience
  2896.      min.ex=mex
  2897.    Endif
  2898.    If mex>max.ex Then ' reset maximum monsters experience
  2899.      max.ex=mex
  2900.    Endif
  2901.    tot.ex#=tot.ex#+mex ' increase total monster experience
  2902.    ' random dungeon level monsters hits
  2903.    mhs=0
  2904.    For j=8 To 11
  2905.      mhs=mhs+userrec.stats2(j)
  2906.    Next
  2907.    mhits=Int(Rnd*mhp/(mhs+1)+mmlvl)
  2908.    If min.hits=0 Then ' set minimum monsters hits
  2909.      min.hits=mhits
  2910.    Endif
  2911.    If mhits<min.hits Then ' reset minimum monsters hits
  2912.      min.hits=mhits
  2913.    Endif
  2914.    If mhits>max.hits Then ' reset maximum monsters hits
  2915.      max.hits=mhits
  2916.    Endif
  2917.    tot.hits#=tot.hits#+mhits ' increase total monster hits
  2918.  Next
  2919.  Color 12 ' ansi color
  2920.  Locate 20,10,0 ' position cursor
  2921.  Print Str$(min.mlvl); ' display monster minimum level
  2922.  Print String$(15-Len(Str$(min.mlvl)),32); ' pad with spaces
  2923.  Print Str$(min.hp); ' display monster minimum hit points
  2924.  Print String$(15-Len(Str$(min.hp)),32); ' pad with spaces
  2925.  Print Str$(min.ex); ' display monster minimum experience
  2926.  Print String$(15-Len(Str$(min.ex)),32); ' pad with spaces
  2927.  Print Str$(min.hits); ' display monster minimum hits
  2928.  Locate 21,10,0 ' position cursor
  2929.  Print Str$(max.mlvl); ' display monster maximum level
  2930.  Print String$(15-Len(Str$(max.mlvl)),32); ' pad with spaces
  2931.  Print Str$(max.hp); ' display monster maximum hit points
  2932.  Print String$(15-Len(Str$(max.hp)),32); ' pad with spaces
  2933.  Print Str$(max.ex); ' display monster maximum experience
  2934.  Print String$(15-Len(Str$(max.ex)),32); ' pad with spaces
  2935.  Print Str$(max.hits); ' display monster maximum hits
  2936.  i=Int(tot.mlvl/10+.5) ' average monster total level
  2937.  Locate 22,10,0 ' position cursor
  2938.  Print Str$(i); ' display average total
  2939.  Print String$(15-Len(Str$(i)),32); ' pad with spaces
  2940.  i=Int(tot.hp#/10+.5) ' average monster total hit points
  2941.  Print Str$(i); ' display average total
  2942.  Print String$(15-Len(Str$(i)),32); ' pad with spaces
  2943.  i=Int(tot.ex#/10+.5) ' average monster total experience
  2944.  Print Str$(i); ' display average total
  2945.  Print String$(15-Len(Str$(i)),32); ' pad with spaces
  2946.  Print Str$(Int(tot.hits#/10+.5)); ' average monster total hits
  2947.  Color 14 ' ansi color
  2948.  x#=userrec.stats1(2)
  2949.  y#=2^x#
  2950.  Locate 15,37,0 ' position cursor
  2951.  Print Str$(y#);
  2952.  x#=x#+6
  2953.  y#=2^x#
  2954.  Locate 16,43,0 ' position cursor
  2955.  Print Str$(y#);
  2956.  Gosub Key.Press ' pause for keystroke
  2957.  Gosub Restore.Screen ' redraw dungeon screen
  2958.  Return ' exit routine
  2959.  
  2960. Info.Screen:
  2961.  Color 14 ' ansi color
  2962.  Print "Mlvl=Int(Rnd*Dlvl+Dlvl/2+1)" Print "Mhp=Int((Rnd*Dlvl*2+1)*Mlvl^2/2+Dlvl*2+Rnd*Mlvl+50)" Print "Exp=Int(Hp/Mlvl)*Int(Dlvl/2+1)+Int(Rnd*Hp)" Print "Mhits=Int(Rnd*(Mhp/Armor)+Mlvl)" Print "Hits=Int(Rnd*Strength+Level/2)*Bonus+Weapon+Dlvl" Print
  2963.  Color 11 ' ansi color Print "Where Mlvl is the monster level, Dlvl is the dungeon level, Mhp is the monster" Print "hit points, Exp is the monsters experience, Armor is your combined armor plus," Print "Weapon is your weapon plus, Strength is your strength, Level is your expertise" Print "level, Hits is the number of points damage your can do to a monster, and Mhits" Print "is the number of points damage a monster can do to you."
  2964.  Color 15 ' ansi color Locate 13,1,0 ' position cursor Print "You now an armor plus of"; Locate 14,1,0 ' position cursor Print "You have a weapon plus of";
  2965.  Locate 15,1,0 ' position cursor
  2966.  Print "Gold needed to reach the next level:";
  2967.  Locate 16,1,0 ' position cursor
  2968.  Print "Experience needed to reach the next level:"; Locate 17,1,0 ' position cursor Print "On this dungeon level, monsters have the following statistics:"; Locate 19,10,0 ' position cursor Color 14 ' ansi color
  2969.  Print "Level         Hit points    Experience     Combat hits"; Locate 20,1,0 ' position cursor Print "min."; Locate 21,1,0 ' position cursor Print "max."; Locate 22,1,0 ' position cursor Print "avg."; Return ' exit routine
  2970.  
  2971.  ' randomize random coordinate increments
  2972. Get.Random.Direction:
  2973.  Select Case Rnd ' random value for selecting nearby x-coordinate cell
  2974.  Case Is<=.3
  2975.    xo=-1 ' cell to the north
  2976.  Case Is>=.7
  2977.    xo=1 ' cell to the south
  2978.  Case Else
  2979.    xo=0 ' neither
  2980.  End Select
  2981.  Select Case Rnd ' random value for selecting nearby y-coordinate cell
  2982.  Case Is<=.3
  2983.    yo=-1 ' cell to the west
  2984.  Case Is>=.7
  2985.    yo=1 ' cell to the east
  2986.  Case Else
  2987.    yo=0 ' neither
  2988.  End Select
  2989.  Coor.Direction=0
  2990.  If cxco+xo>1 Then ' x-coordinates boundary
  2991.    If cxco+xo<22 Then ' x-coordinate boundary
  2992.      If cyco+yo>1 Then ' y-coordinate boundary
  2993.        If cyco+yo<76 Then ' y-coordinate boundary
  2994.          If Not (xo=0 And yo=0) Then ' not original xy-coordinate
  2995.            Coor.Direction=-1
  2996.          Endif
  2997.        Endif
  2998.      Endif
  2999.    Endif
  3000.  Endif
  3001.  Return ' exit routine
  3002.  
  3003. ' cast spell type 1
  3004. Cast.Spell.Type1:
  3005.  userrec.stats2(13)=userrec.stats2(13)-1 ' decrement spell points
  3006.  If userrec.stats2(13)<0 Then ' not enough remaining to cast spell,
  3007.    userrec.stats2(13)=0 ' reset spell point counter to zero
  3008.    Return ' exit routine
  3009.  Endif
  3010.  Gosub Cast.Spell.Message ' display spell name being cast
  3011.  Select Case sp ' select spell number 1 to 10
  3012.  Case 1 ' heal
  3013.    Gosub Increment.Hits ' update players combat hits
  3014.  Case 2 ' protection
  3015.    mhpm=userrec.stats2(5) ' monster hit point minus amount equal to players dexterity
  3016.    mhpmc=1 ' monster hit point minus counter
  3017.  Case 3 ' magic missile
  3018.    Gosub Pause.Second ' wait
  3019.    bonus=2 ' multiplier
  3020.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3021.    Gosub Monster.Attack
  3022.    Gosub Encounter.Cells
  3023.  Case 4 ' shield
  3024.    shp=userrec.stats2(9) ' shield amount equal to players armor
  3025.    shpc=1 ' shield counter
  3026.  Case 5 ' strength
  3027.    stp=userrec.stats2(1) ' strength amount equal to players strength
  3028.    stpc=1 ' strength counter
  3029.  Case 6 ' sleep
  3030.    slp=1 ' sleep flag
  3031.    slpc=1 ' sleep counter
  3032.  Case 7 ' locate
  3033.    Gosub Pause.Second ' wait
  3034.    ' find traps/pits
  3035.    i=0 ' traps flag
  3036.    j=0 ' pits flag
  3037.    ' check surrounding cells
  3038.    If dungeonrec.dat(xco-1,yco)=94 Then ' trap to the north
  3039.      Color 15 ' ansi color
  3040.      Locate xco-1,yco,0 ' position cursor
  3041.      Print "^"; ' display nearby trap symbol
  3042.      i=-1 ' set trap flag
  3043.    Endif
  3044.    If dungeonrec.dat(xco+1,yco)=94 Then ' trap to the south
  3045.      Color 15 ' ansi color
  3046.      Locate xco+1,yco,0 ' position cursor
  3047.      Print "^"; ' display nearby trap
  3048.      i=-1 ' set trap flag
  3049.    Endif
  3050.    If dungeonrec.dat(xco,yco-1)=94 Then ' trap to the west
  3051.      Color 15 ' ansi color
  3052.      Locate xco,yco-1,0 ' position cursor
  3053.      Print "^"; ' display trap
  3054.      i=-1 ' set trap flag
  3055.    Endif
  3056.    If dungeonrec.dat(xco,yco+1)=94 Then ' trap to the east
  3057.      Color 15 ' ansi color
  3058.      Locate xco,yco+1,0 ' position cursor
  3059.      Print "^"; ' display trap
  3060.      i=-1 ' set trap flag
  3061.    Endif
  3062.    If dungeonrec.dat(xco-1,yco)=111 Then ' pit to the north
  3063.      Color 15 ' ansi color
  3064.      Locate xco-1,yco,0 ' position cursor
  3065.      Print "o"; ' display pit
  3066.      j=-1 ' set pit flag
  3067.    Endif
  3068.    If dungeonrec.dat(xco+1,yco)=111 Then ' pit to the south
  3069.      Color 15 ' ansi color
  3070.      Locate xco+1,yco,0 ' position cursor
  3071.      Print "o"; ' display pit
  3072.      j=-1 ' set pit flag
  3073.    Endif
  3074.    If dungeonrec.dat(xco,yco-1)=111 Then ' pit to the west
  3075.      Color 15 ' ansi color
  3076.      Locate xco,yco-1,0 ' position cursor
  3077.      Print "o"; ' display pit
  3078.      j=-1 ' set pit flag
  3079.    Endif
  3080.    If dungeonrec.dat(xco,yco+1)=111 Then ' pit to the east
  3081.      Color 15 ' ansi color
  3082.      Locate xco,yco+1,0 ' position cursor
  3083.      Print "o"; ' display pit
  3084.      j=-1 ' set pit flag
  3085.    Endif
  3086.    If i=0 And j=0 Then' no traps or pits
  3087.      Color 14 ' ansi color
  3088.      a$="There are no traps or pits here.."
  3089.    Else ' traps and/or pits
  3090.      Color 11 ' ansi color
  3091.      a$="You discovered some "
  3092.      If i And j Then ' both traps and pits
  3093.        a$=a$+"traps and pits.."
  3094.      Else ' traps or pits
  3095.         If i Then ' only traps
  3096.           a$=a$+"traps.."
  3097.         Else ' only pits
  3098.           a$=a$+"pits.."
  3099.         Endif
  3100.      Endif
  3101.    Endif
  3102.    Gosub Display.Message ' output message
  3103.    Gosub Pause.Second ' wait
  3104.  Case 8 ' pyrotechnics
  3105.    Gosub Pause.Second ' wait
  3106.    bonus=2 ' multiplier
  3107.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3108.    Gosub Monster.Attack
  3109.    Gosub Encounter.Cells
  3110.  Case 9 ' firestorm
  3111.    Gosub Pause.Second ' wait
  3112.    bonus=2 ' multiplier
  3113.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3114.    Gosub Monster.Attack
  3115.    Gosub Encounter.Cells
  3116.  Case 10 ' transmute
  3117.    Gosub Pause.Second 'pause screen
  3118.    ' convert surrounding cells to gold
  3119.    If dungeonrec.dat(xco-1,yco)=46 And xco>1 Then
  3120.      Color 15 ' ansi color
  3121.      Locate xco-1,yco,0 ' position cursor
  3122.      Print "$"; ' display gold
  3123.      dungeonrec.dat(xco-1,yco)=36 ' set dungeon cell to gold
  3124.      If dungeonrec.stats(12)=0 Then ' all dungeon level coins not found yet
  3125.        dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment number of coins in dungeon level
  3126.      Endif
  3127.    Endif
  3128.    If dungeonrec.dat(xco+1,yco)=46 And xco<23 Then
  3129.      Color 15 ' ansi color
  3130.      Locate xco+1,yco,0 ' position cursor
  3131.      Print "$"; ' display gold
  3132.      dungeonrec.dat(xco+1,yco)=36 ' set dungeon cell to gold
  3133.      If dungeonrec.stats(12)=0 Then ' all dungeon level coins not found yet
  3134.        dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment number of coins in dungeon level
  3135.      Endif
  3136.    Endif
  3137.    If dungeonrec.dat(xco,yco-1)=46 And yco>1 Then
  3138.      Color 15 ' ansi color
  3139.      Locate xco,yco-1,0 ' position cursor
  3140.      Print "$"; ' display gold
  3141.      dungeonrec.dat(xco,yco-1)=36 ' set dungeon cell to gold
  3142.      If dungeonrec.stats(12)=0 Then ' all dungeon level coins not found yet
  3143.        dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment number of coins in dungeon level
  3144.      Endif
  3145.    Endif
  3146.    If dungeonrec.dat(xco,yco+1)=46 And yco<76 Then
  3147.      Color 15 ' ansi color
  3148.      Locate xco,yco+1,0 ' position cursor
  3149.      Print "$"; ' display gold
  3150.      dungeonrec.dat(xco,yco+1)=36 ' set dungeon cell to gold
  3151.      If dungeonrec.stats(12)=0 Then ' all dungeon level coins not found yet
  3152.        dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment number of coins in dungeon level
  3153.      Endif
  3154.    Endif
  3155.  End Select
  3156.  Return ' exit routine
  3157.  
  3158. ' cast spell type 2
  3159. Cast.Spell.Type2:
  3160.  userrec.stats2(14)=userrec.stats2(14)-2 ' decrement spell points
  3161.  If userrec.stats2(14)<0 Then ' not enough remaining to cast spell,
  3162.    userrec.stats2(14)=0 ' reset spell point counter to zero
  3163.    Return ' exit routine
  3164.  Endif
  3165.  Gosub Cast.Spell.Message ' display spell name being cast
  3166.  Select Case sp ' select spell 1 to 10
  3167.  Case 1 ' restoration
  3168.    ' increment players hit points by constitution times two
  3169.    userrec.stats1(4)=userrec.stats1(4)+userrec.stats2(4)
  3170.    Gosub Increment.Hits ' update players combat hits
  3171.  Case 2 ' scare
  3172.    mhpm=userrec.stats2(5) ' monster hit point minus amount equal to dexterity
  3173.    mhpmc=2 ' monster hit point minus counter
  3174.  Case 3 ' fireball
  3175.    Gosub Pause.Second ' wait
  3176.    bonus=3 ' multiplier
  3177.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3178.    Gosub Monster.Attack
  3179.    Gosub Encounter.Cells
  3180.  Case 4 ' obscurement
  3181.    shp=userrec.stats2(9) ' shield amount equal to players armor
  3182.    shpc=2 ' shield counter
  3183.  Case 5 ' power shield
  3184.    stp=userrec.stats2(1) ' strength amount equal to players strength
  3185.    stpc=2 ' strength counter
  3186.  Case 6 ' wall of will
  3187.    slp=1 ' sleep flag
  3188.    slpc=2 ' sleep counter
  3189.  Case 7 ' light
  3190.    ll=3 ' set extended cell display amount
  3191.    llc=1 ' set extended cell display counter
  3192.    Gosub Cell.Action ' compute nearby cells
  3193.  Case 8 ' levitate
  3194.    Do ' loop until empty cell to move player
  3195.      For k=1 To Int(Rnd*4+2) ' move player random times
  3196.        c=0 ' loop counter
  3197.        Do ' find empty cell
  3198.          c=c+1 ' increment counter
  3199.          If c>10 Then ' avoid infinite loop
  3200.            Exit For ' exit routine
  3201.          Endif
  3202.          cxco=xco ' store x-coordinate
  3203.          cyco=yco ' store y-coordinate
  3204.          Gosub Get.Random.Direction ' get valid random direction
  3205.          If Coor.Direction Then ' returned valid random direction
  3206.            Exit Do ' found valid random direction
  3207.          Endif
  3208.        Loop 
  3209.        ' move to selected cell
  3210.        xco=xco+xo ' increment players x coordinate
  3211.        yco=yco+yo ' increment players y coordinate
  3212.        Gosub Update.Player ' update nearby cell actions
  3213.      Next ' get next levitate move
  3214.      If dungeonrec.dat(xco,yco)=46 Then ' move to an dungeon dot
  3215.        Exit Do ' end move player
  3216.      Endif
  3217.    Loop
  3218.  Case 9 ' monster summon
  3219.    For k=1 To Int(Rnd*4+2) ' encounter random number of monsters
  3220.      c=0 ' loop counter
  3221.      Do ' loop until empty nearby cell for monster
  3222.        c=c+1 ' increment loop counter
  3223.        If c>10 Then' avoid infinite loop
  3224.          Exit For ' exit more than 10 loops
  3225.        Endif
  3226.        cxco=xco ' store x-coordinate
  3227.        cyco=yco ' store y-coordinate
  3228.        Gosub Get.Random.Direction ' get valid random direction
  3229.        If Coor.Direction Then ' returned valid random direction
  3230.          If dungeonrec.dat(xco+xo,yco+yo)=46 Then ' empty dungeon cell
  3231.            Exit Do ' fond empty cell at random direction
  3232.          Endif
  3233.        Endif
  3234.      Loop
  3235.      mxco=xco+xo ' set monster xy
  3236.      myco=yco+yo ' set monster xy
  3237.      If dungeonrec.stats(5)=0 Then ' all dungeon level monsters not found yet
  3238.        dungeonrec.stats(6)=dungeonrec.stats(6)+1 ' increment number of monsters on level
  3239.      Endif
  3240.      ' set dungeon array monster xy to monster symbol
  3241.      dungeonrec.dat(mxco,myco)=35
  3242.      Color 15 ' ansi color
  3243.      Locate mxco,myco,0 ' position cursor
  3244.      Print "#"; ' display monster symbol
  3245.      mn=Int(Rnd*100+1) ' select random monster
  3246.      Gosub Encounter.Monster ' get the monster statistics
  3247.    Next ' get next monster
  3248.  Case 10 ' finger of death
  3249.    Gosub Pause.Second ' wait
  3250.    Gosub Cell.Monster.Attack ' all nearby monsters die
  3251.  End Select
  3252.  Return ' exit routine
  3253.  
  3254. ' cast spell type 3
  3255. Cast.Spell.Type3:
  3256.  userrec.stats2(15)=userrec.stats2(15)-3 ' decrement spell points
  3257.  If userrec.stats2(15)<0 Then ' not enough remaining to cast spell,
  3258.    userrec.stats2(15)=0 ' reset spell point counter to zero
  3259.    Return ' exit routine
  3260.  Endif
  3261.  Gosub Cast.Spell.Message ' display spell name being cast
  3262.  Select Case sp ' select spell 1 to 10
  3263.  Case 1 ' regeneration
  3264.    ' increase players hit points by constitution times three
  3265.    x=userrec.stats2(4)
  3266.    x=x*2
  3267.    userrec.stats1(4)=userrec.stats1(4)+x
  3268.    Gosub Increment.Hits ' reset any counters
  3269.  Case 2 'forget
  3270.    mhpm=userrec.stats2(5) ' monster hit point minus amount equal to players dexterity
  3271.    mhpmc=3 ' monster hit point minus counter
  3272.  Case 3 ' lightning bolt
  3273.    Gosub Pause.Second ' wait
  3274.    bonus=4 ' multiplier
  3275.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3276.    Gosub Monster.Attack
  3277.    Gosub Encounter.Cells
  3278.  Case 4 ' phantasmal force
  3279.    shp=userrec.stats2(9) ' shield amount equal to players armor
  3280.    shpc=3 ' shield counter
  3281.  Case 5 ' wall of force
  3282.    stp=userrec.stats2(1) ' strength amount equal to players strength
  3283.    stpc=3 ' strength counter
  3284.  Case 6 ' charm monster
  3285.    slp=1 ' sleep flag
  3286.    slpc=3 ' sleep counter
  3287.  Case 7 ' continual light
  3288.    ll=2 ' set extended cell display amount
  3289.    llc=4 ' set extended cell display counter
  3290.    Gosub Cell.Action ' compute nearby cells
  3291.  Case 8 ' passwall
  3292.    If pwl=1 Then ' already in passwall mode
  3293.      Return ' exit routine
  3294.    Endif
  3295.    pwl=1 ' set passwall flag
  3296.    For q=1 To Int(Rnd*4+2) ' random amount of passwall moves
  3297.      Gosub Move.Passwall ' separate input loop for passwall
  3298.    Next ' to move through dungeon walls
  3299.    ' continue passwall if loop ended in dungeon wall
  3300.    While dungeonrec.dat(xco,yco)=176
  3301.      Gosub Move.Passwall ' move until out of dungeon wall
  3302.    Wend ' end passwall
  3303.    pwl=0 ' reset passwall flag
  3304.    Return ' exit routine
  3305.  Case 9 ' demon summon
  3306.    For k=1 To Int(Rnd*4+2) ' encounter random number of demons
  3307.      c=0 ' loop counter
  3308.      Do ' loop until empty nearby cell for demon
  3309.        c=c+1 ' increment loop counter
  3310.        If c>10 Then ' avoid infinite loop
  3311.          Exit For ' exit more than ten loops
  3312.        Endif
  3313.        cxco=xco ' store x-coordinate
  3314.        cyco=yco ' store y-coordinate
  3315.        Gosub Get.Random.Direction ' get valid random direction
  3316.        If Coor.Direction Then ' returned valid random direction
  3317.          If dungeonrec.dat(xco+xo,yco+yo)=46 Then ' empty dungeon cell
  3318.            Exit Do ' found empty cell at random direction
  3319.          Endif
  3320.        Endif
  3321.      Loop
  3322.      If dungeonrec.stats(5)=0 Then ' all dungeon level monsters not found yet
  3323.        dungeonrec.stats(6)=dungeonrec.stats(6)+1 ' increment number of monsters on level
  3324.      Endif
  3325.      mxco=xco+xo ' set monster xy
  3326.      myco=yco+yo ' set monster xy
  3327.      ' set dungeon array monster xy to monster symbol
  3328.      dungeonrec.dat(mxco,myco)=35
  3329.      Color 15 ' ansi color
  3330.      Locate mxco,myco,0 ' position cursor
  3331.      Print "#"; ' display monster symbol
  3332.      mn=101 ' monster number 54 is demon in data
  3333.      Gosub Encounter.Monster ' get the monster statistics
  3334.    Next ' get next demon
  3335.  Case 10 ' doomkill
  3336.    Gosub Pause.Second ' wait
  3337.    Gosub Cell.Monster.Attack ' all nearby monsters die
  3338.  End Select
  3339.  Return ' exit routine
  3340.  
  3341. ' cast spell type 4
  3342. Cast.Spell.Type4:
  3343.  userrec.stats2(16)=userrec.stats2(16)-4 ' decrement spell points
  3344.  If userrec.stats2(16)<0 Then ' not enough remaining to cast spell,
  3345.    userrec.stats2(16)=0 ' reset spell point counter to zero
  3346.    Return ' exit routine
  3347.  Endif
  3348.  Gosub Cast.Spell.Message ' display spell name being cast
  3349.  Select Case sp ' select spell 1 to 10
  3350.  Case 1 ' resurrection
  3351.    ' increase players hit points by constitution times four
  3352.    x=userrec.stats2(4)
  3353.    x=x*3
  3354.    userrec.stats1(4)=userrec.stats1(4)+x
  3355.    Gosub Increment.Hits
  3356.  Case 2 ' fear
  3357.    mhpm=userrec.stats2(5) ' monster hit point minus amount equal to players dexterity
  3358.    mhpmc=4 ' monster hit point minus counter
  3359.  Case 3 ' disintegrate
  3360.    Gosub Pause.Second ' wait
  3361.    bonus=5 ' multiplier
  3362.    Gosub Attack.Nearby.Monsters ' attack nearby monsters
  3363.    Gosub Monster.Attack
  3364.    Gosub Encounter.Cells
  3365.  Case 4 ' blade barrier
  3366.    shp=userrec.stats2(9) ' shield amount equal to armor
  3367.    shpc=4 ' shield counter
  3368.  Case 5 ' enchanted weapon
  3369.    stp=userrec.stats2(1) ' strength amount equal to players strength
  3370.    stpc=4 ' strength counter
  3371.  Case 6 ' hold monster
  3372.    slp=1 ' sleep flag
  3373.    slpc=4 ' sleep counter
  3374.  Case 7 ' teleport
  3375.    Gosub Teleport ' teleport player
  3376.  Case 8 ' polymorph
  3377.    Gosub Cell.Monster.Attack ' all nearby monsters die
  3378.  Case 9 ' time stop
  3379.    pw=1 ' pass monsters flag
  3380.    pwc=5 ' pass monsters counter
  3381.  Case 10 ' genocide
  3382.    gd=1 ' set extended monster cell death flag
  3383.    gdc=4 ' set extended monster cell death counter
  3384.    Gosub Cell.Monster.Attack ' all nearby monsters die
  3385.  End Select
  3386.  Return ' exit routine
  3387.  
  3388. ' passwall input routine
  3389. Move.Passwall:
  3390.  Do ' get a keystroke
  3391.    Gosub Get.Keystroke ' only keystrokes allowed 0 to 9, and
  3392.  Loop Until (x>=0 And x<=9) Or Len(x$)=2 ' extended ascii
  3393.  xo=xco ' store players x-coordinate
  3394.  yo=yco ' store players y-coordinate
  3395.  Select Case Len(x$) ' process input
  3396.  Case 1 ' input length
  3397.    Select Case x$ ' select input key
  3398.    Case "1" ' attack nearby monsters
  3399.      Gosub Attack.Nearby.Monsters
  3400.      Gosub Monster.Attack
  3401.      Gosub Encounter.Cells
  3402.    Case "2" ' passwall move up
  3403.      xo=xo+1 ' increment temporary variable
  3404.      If xo<23 Then ' check array bounds
  3405.        xco=xo ' update players x-coordinate
  3406.        yco=yo ' update players y-coordinate
  3407.        Gosub Update.Player ' update nearby cell actions
  3408.      Endif
  3409.    Case "3" ' cast spell
  3410.      Gosub Cast.Chant
  3411.    Case "4" ' passwall move left
  3412.      yo=yo-1 ' decrement temporary variable
  3413.      If yo>1 Then ' check array bounds
  3414.        xco=xo ' update players x-coordinate
  3415.        yco=yo ' update players y-coordinate
  3416.        Gosub Update.Player ' update nearby cell actions
  3417.      Endif
  3418.    Case "5", Chr$(13) ' enter/accept key/null action
  3419.      Gosub Update.Hits
  3420.    Case "6" ' passwall move right
  3421.      yo=yo+1 'increment temporary variable
  3422.      If yo<76 Then ' check array bouns
  3423.        xco=xo ' update players x-coordinate
  3424.        yco=yo ' update players y-coordinate
  3425.        Gosub Update.Player ' update nearby cell actions
  3426.      Endif
  3427.    Case "7" ' evade monster
  3428.      Gosub Evade.Monster
  3429.    Case "8" ' passwall move down
  3430.      xo=xo-1 ' decrement temporary variable
  3431.      If xo>1 Then ' check array bounds
  3432.        xco=xo ' update players x-coordinate
  3433.        yco=yo ' update players y-coordinate
  3434.        Gosub Update.Player ' update nearby cell actions
  3435.      Endif
  3436.    Case "9" ' ignore key/null action/update hits
  3437.      Gosub Update.Hits
  3438.    End Select
  3439.  Case 2 ' input length
  3440.    sp=Asc(Mid$(x$,2)) ' convert extended ascii input
  3441.    Select Case sp ' select second input key,
  3442.    Case 79 ' 1, attack nearby monsters
  3443.      Gosub Attack.Nearby.Monsters
  3444.      Gosub Monster.Attack
  3445.      Gosub Encounter.Cells
  3446.    Case 80 ' 2, passwall move player down
  3447.      xo=xo+1 ' increment temporary variable
  3448.      If xo<23 Then ' check array bounds
  3449.        xco=xo ' update players x-coordinate
  3450.        yco=yo ' update players y-coordinate
  3451.        Gosub Update.Player ' update nearby cell actions
  3452.      Endif
  3453.    Case 81 ' 3, cast spell
  3454.      Gosub Cast.Chant
  3455.    Case 75 ' 4, passwall move player left
  3456.      yo=yo-1 ' decrement temporary variable
  3457.      If yo>1 Then ' check array bounds
  3458.        xco=xo ' update players x-coordinate
  3459.        yco=yo ' update players y-coordinate
  3460.        Gosub Update.Player ' update nearby cell actions
  3461.      Endif
  3462.    Case 76 ' 5, enter/accept key/null action
  3463.      Gosub Update.Hits
  3464.    Case 77 ' 6, passwall move player right
  3465.      yo=yo+1 ' increment temporary variable
  3466.      If yo<76 Then ' check array bounds
  3467.        xco=xo ' update players x-coordinate
  3468.        yco=yo ' update players y-coordinate
  3469.        Gosub Update.Player ' update nearby cell actions
  3470.      Endif
  3471.    Case 71 ' 7, evade monster
  3472.      Gosub Evade.Monster
  3473.    Case 72 ' 8, passwall move player up
  3474.      xo=xo-1 ' decrement temporary variable
  3475.      If xo>1 Then ' check array bounds
  3476.        xco=xo ' update players x-coordinate
  3477.        yco=yo ' update players y-coordinate
  3478.        Gosub Update.Player ' update nearby cell actions
  3479.      Endif
  3480.    Case 73 ' 9, ignore key/null action/update hits
  3481.      Gosub Update.Hits
  3482.    ' F1 to F10, cast spell type 1
  3483.    Case 59 To 68
  3484.      spn=1 ' set spell type
  3485.      sp=sp-58 ' calculate spell number
  3486.      Gosub Cast.Spell.Type1
  3487.    ' Control-F1 to F10, cast spell type 2
  3488.    Case 94 To 103
  3489.      spn=2 ' set spell type
  3490.      sp=sp-93 ' calculate spell number
  3491.      Gosub Cast.Spell.Type2
  3492.    ' Shift-F1 to F10, cast spell type 3
  3493.    Case 84 To 93
  3494.      spn=3 ' set spell type
  3495.      sp=sp-83 ' calculate spell number
  3496.      Gosub Cast.Spell.Type3
  3497.    ' Alt-F1 to F10, cast spell type 4
  3498.    Case 104 To 113
  3499.      spn=4 ' set spell type
  3500.      sp=sp-103 ' calculate spell number
  3501.      Gosub Cast.Spell.Type4
  3502.    End Select
  3503.  End Select
  3504.  Return ' exit routine
  3505.  
  3506. ' kill all nearby monsters
  3507. Cell.Monster.Attack:
  3508.  For mn=1 To 8 ' loop through all eight surrounding cells
  3509.    If monsters(mn,1) Or monsters(mn,2) Then ' monster xy exists
  3510.      mxco=monsters(mn,1) ' get monster x-coordinate
  3511.      myco=monsters(mn,2) ' get monster y-coordinate
  3512.      ex#=monsters(mn,5) ' get monster experience
  3513.      monsters(mn,1)=0 ' reset monster x-coordinate
  3514.      monsters(mn,2)=0 ' reset monster y-coordinate
  3515.      Gosub Update.Stats ' update players statistics with experience
  3516.       ' reset dungeon array monster to gold symbol
  3517.      dungeonrec.dat(mxco,myco)=36
  3518.      If dungeonrec.stats(12)=0 Then ' all dungeon level coins not found yet
  3519.        dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment coins in dungeon
  3520.      Endif
  3521.      Color 15 ' ansi color
  3522.      Locate mxco,myco,0 ' position cursor
  3523.      Print "$"; ' display gold
  3524.      dungeonrec.stats(6)=dungeonrec.stats(6)-1 ' decrement number of monsters
  3525.      If dungeonrec.stats(6)=0 Then ' last monster counter
  3526.        If dungeonrec.stats(5)=0 Then ' last monster in dungeon level flag
  3527.          dungeonrec.stats(5)=1 ' set last monster in dungeon level flag
  3528.          ' calculate bonus experience for last monster
  3529.          ex#=(Rnd*dlvl#*2+1)*userrec.stats1(2)^2/2
  3530.          ex#=ex#+dlvl#*2+Rnd*userrec.stats1(2)*50
  3531.          ex#=Int(ex#)
  3532.          Color 14 ' ansi color
  3533.          a$="You killed all the monsters on this level! You gain"
  3534.          a$=a$+Str$(ex#)+" experience!"
  3535.          Gosub Display.Message ' output message
  3536.          Gosub Update.Stats ' update players statistics wth experience
  3537.          Gosub Pause.Second ' wait
  3538.        Endif
  3539.      Endif
  3540.    Endif
  3541.  Next ' get next monster
  3542.  Return ' exit routine
  3543.  
  3544. ' teleport player randomly in dungeon level to another cell
  3545. Teleport:
  3546.  Color 7 ' display cell player will be teleported from
  3547.  Locate xco,yco,0 ' position cursor
  3548.  Print Chr$(dungeonrec.dat(xco,yco)); ' display dungeon cell symbol
  3549.  Do ' loop until player teleports to an empty cell
  3550.    txo=xco ' store players x-coordinate
  3551.    tyo=yco ' store players y-coordinate
  3552.    For k=1 To Int(Rnd*2+2) ' random number of times to teleport
  3553.      c=0 ' loop counter
  3554.      Do ' loop until empty nearby cell for demon
  3555.        c=c+1 ' increment loop counter
  3556.        If c>10 Then ' avoid infinite loop
  3557.          Exit For ' exit more than ten loops
  3558.        Endif
  3559.        If Rnd>.5 Then ' select teleport up 50/50
  3560.          xo=-1 ' set x-coordinate increment
  3561.        Else ' teleport down 50/50
  3562.          xo=1 ' set x-coordinate increment
  3563.        Endif
  3564.        If Rnd>.5 Then ' select teleport left 50/50
  3565.          yo=-1 ' set y-coordinate increment
  3566.        Else ' teleport right 50/50
  3567.          yo=1 ' set y-coordinate increment
  3568.        Endif
  3569.        ' until players xy-coor plus selected xy is within bounds
  3570.        If txo+xo>1 Then ' x-coordinate boundary
  3571.          If txo+xo<22 Then ' x-coordinate boundary
  3572.            If tyo+yo>1 Then ' y-coordinate boundary
  3573.              If tyo+yo<76 Then ' y-coordinate boundary
  3574.                If (txo+xo)<>xco Then ' not players xy-coordinate
  3575.                  If (tyo+yo)<>yco Then ' not players xy-coordinate
  3576.                    Exit Do
  3577.                  Endif
  3578.                Endif
  3579.              Endif
  3580.            Endif
  3581.          Endif
  3582.        Endif
  3583.      Loop
  3584.      txo=txo+xo ' update stored players x-coordinate
  3585.      tyo=tyo+yo ' update stored players y-coordinate
  3586.    Next ' get next cell
  3587.    ' exit loop if destination teleport cell is dungeon dot
  3588.    If dungeonrec.dat(txo,tyo)=46 Then ' move to an dungeon dot
  3589.      Exit Do ' end move player
  3590.    Endif
  3591.  Loop
  3592.  xco=txo ' set players x-coordinate to destination x-coordinate
  3593.  yco=tyo ' set players y-coordinate to destination y-coordinate
  3594.  Gosub Update.Player ' update nearby cell actions
  3595.  Return ' exit routine
  3596.  
  3597. ' display prompt, get keypress
  3598. Key.Press:
  3599.  Color 13 ' ansi color
  3600.  Locate 25,35,0 ' position cursor
  3601.  Print "Press a key:"; ' display message
  3602.  Gosub Get.Key.Press ' get a single keystroke
  3603.  Return ' exit routine
  3604.  
  3605. ' get a single keystroke
  3606. Get.Key.Press:
  3607.  While Inkey$="" ' wait for any input
  3608.  Wend ' wait
  3609.  Return ' exit routine
  3610.  
  3611. ' routine to buy player statistics with gold
  3612. Trade.Stats:
  3613.  Gosub Store.Dungeon.Level ' store dungeon screen
  3614.  Color 14, 1 ' blue background
  3615.  Cls ' clear screen
  3616.  ' make statistic trading screen
  3617.  Color 14 ' ansi color
  3618.  Locate 1,25,0 ' position cursor
  3619.  Print "Trade Gold For Player Statistics";
  3620.  Color 15 ' ansi color
  3621.  Locate 10,28,0 ' position cursor
  3622.  Print "(1) (2) (3) (4) (5) (6)";
  3623.  Color 12 ' ansi color
  3624.  Locate 11,28,0 ' position cursor
  3625.  Print "Str Int Wis Con Dex Cha";
  3626.  Color 13 ' ansi color
  3627.  Locate 13,15,0 ' position cursor
  3628.  Print "Purchasing Character Stats(1, 2, 3, 4, 5, or 6 to buy)";
  3629.  Color 15 ' ansi color
  3630.  Locate 25,22,0 ' position cursor
  3631.  Print "Press <enter> to return to the Dungeon..";
  3632.   ' calculate cost of statistic
  3633.  buy#=Int(Rnd*userrec.stats1(2)+5)*50+Int(Rnd*100)
  3634.  ' display message of cost
  3635.  i$="The average stat point is"+Str$(buy#)+" Gold."
  3636.  i=40-Int(Len(i$)/2) ' center
  3637.  Color 14 ' ansi color
  3638.  Locate 14,i,0 ' position cursor
  3639.  Print i$;
  3640.  Color 14 ' ansi color
  3641.  Locate 15,33,0 ' position cursor
  3642.  Print "Gold remaining:";
  3643.  Do ' loop to select statistics
  3644.    Color 10 ' ansi color
  3645.    Locate 12,29,0 ' position cursor
  3646.    ' display players statistics
  3647.    For x=1 To 6
  3648.      Print Right$(Str$(userrec.stats2(x)),2)+"  ";
  3649.    Next
  3650.    Locate 16,1,0 ' position cursor
  3651.    Print Space$(79);
  3652.    ' display players gold amount remaining
  3653.    i=40-Len(Str$(userrec.stats1(5)))/2 ' center
  3654.    Color 15 ' ansi color
  3655.    Locate 16,i,0 ' position cursor
  3656.    Print Str$(userrec.stats1(5)); ' output gold amount
  3657.    If userrec.stats1(5)-buy#<=0 Then ' calculate gold remaining to stat cost
  3658.      Gosub Clear.Status.Line2 ' clear status line area
  3659.      Color 14 ' ansi color
  3660.      Locate 24,21,0 ' position cursor
  3661.      Print "You do not have enough Gold remaining!";
  3662.      Exit Do ' exit loop
  3663.    Endif
  3664.    Do ' get a keystroke
  3665.      Gosub Get.Keystroke
  3666.    Loop Until (x>=1 And x<=6) Or x$=Chr$(13)
  3667.    ' presses 1 to 6 to buy statistic space to exit
  3668.    If x$=Chr$(13) Then ' enter pressed
  3669.      Gosub Clear.Status.Line2 ' clear status line area
  3670.      Exit Do ' exit loop
  3671.    Endif
  3672.    userrec.stats2(x)=userrec.stats2(x)+1 ' increment statistic
  3673.    If userrec.stats2(x)<100 Then ' check valid statistic
  3674.      userrec.stats1(5)=userrec.stats1(5)-buy# ' decrement gold by stat cost
  3675.    Else
  3676.      userrec.stats2(x)=99 ' reset statistic
  3677.    Endif
  3678.  Loop ' loop to get stat to buy
  3679.  Gosub Key.Press ' wait
  3680.  Gosub Restore.Screen ' redraw dungeon screen
  3681.  Return ' exit routine
  3682.  
  3683. ' routine to buy inventory items with gold
  3684. Buy.Inventory:
  3685.  Gosub Store.Dungeon.Level ' store dungeon screen
  3686.  Color 14, 1 ' blue background
  3687.  Cls ' clear screen
  3688.  ' make inventory buying screen
  3689.  Color 14 ' ansi color
  3690.  Locate 1,25,0 ' position cursor
  3691.  Print "Buy Inventory Items With Gold";
  3692.  Color 15 ' ansi color
  3693.  Locate 10,28,0 ' position cursor
  3694.  Print "(1) (2) (3) (4) (5) (6)";
  3695.  Color 12 ' ansi color
  3696.  Locate 11,29,0 ' position cursor
  3697.  Print "WE  SH  AR  CL  HE  BO";
  3698.  Color 13 ' ansi color
  3699.  Locate 13,15,0 ' position cursor
  3700.  Print "Purchasing Inventory Items(1, 2, 3, 4, 5, or 6 to buy)";
  3701.  Color 15 ' ansi color
  3702.  Locate 25,22,0 ' position cursor
  3703.  Print "Press <enter> to return to the Dungeon..";
  3704.  ' calculate cost of inventory item
  3705.  buy#=Int(Rnd*userrec.stats1(2)+5)*50+Int(Rnd*100)
  3706.  ' display message of cost
  3707.  i$="The average item point is"+Str$(buy#)+" Gold."
  3708.  i=40-Int(Len(i$)/2) ' center
  3709.  Color 14 ' ansi color
  3710.  Locate 14,i,0 ' position cursor
  3711.  Print i$;
  3712.  Color 14 ' ansi color
  3713.  Locate 15,33,0 ' position cursor
  3714.  Print "Gold remaining:";
  3715.  Do ' loop to select item
  3716.    Color 10 ' ansi color
  3717.    Locate 12,29,0 ' position cursor
  3718.    ' display players statistics
  3719.    For x=7 To 12
  3720.      Print Right$(Str$(userrec.stats2(x)),2)+"  ";
  3721.    Next
  3722.    Locate 16,1,0 ' position cursor
  3723.    Print Space$(79);
  3724.    ' display players gold amount remaining
  3725.    i=40-Len(Str$(userrec.stats1(5)))/2 ' center
  3726.    Color 15 ' ansi color
  3727.    Locate 16,i,0 ' position cursor
  3728.    Print Str$(userrec.stats1(5)); ' output gold amount
  3729.    If userrec.stats1(5)-buy#<=0 Then ' calculate gold remaining to stat cost
  3730.      Gosub Clear.Status.Line2 ' clear status line area
  3731.      Color 14 ' ansi color
  3732.      Locate 24,21,0 ' position cursor
  3733.      Print "You do not have enough Gold remaining!";
  3734.      Exit Do ' exit loop
  3735.    Endif
  3736.    Do ' get a keystroke
  3737.      Gosub Get.Keystroke
  3738.    Loop Until (x>=1 And x<=6) Or x$=Chr$(13)
  3739.    ' presses 1 to 6 to buy statistic space to exit
  3740.    If x$=Chr$(13) Then ' enter pressed
  3741.      Gosub Clear.Status.Line2 ' clear status line area
  3742.      Exit Do ' exit loop
  3743.    Endif
  3744.    userrec.stats2(x+6)=userrec.stats2(x+6)+1 ' increment inventory statistic
  3745.    If userrec.stats2(x+6)<100 Then ' check valid statistic
  3746.      userrec.stats1(5)=userrec.stats1(5)-buy# ' decrement gold by stat cost
  3747.    Else
  3748.      userrec.stats2(x+6)=99 ' reset statistic
  3749.    Endif
  3750.  Loop ' loop to get stat to buy
  3751.  Gosub Key.Press ' wait
  3752.  Gosub Restore.Screen ' redraw dungeon screen
  3753.  Return ' exit routine
  3754.  
  3755. ' display screen of players learned spells
  3756. Learned.Spells:
  3757.  Gosub Store.Dungeon.Level ' store dungeon screen
  3758.  Color 14, 1 ' blue background
  3759.  Cls ' clear screen
  3760.  ' make learned spells screen
  3761.  Locate 1,15,0 ' position cursor
  3762.  Color 15 ' ansi color
  3763.  Print "Your player has memorized the following spell chants:";
  3764.   ' restore data pointer to spell data
  3765.  Color 14 ' ansi color
  3766.  Restore Spell.Data
  3767.  For i=1 To 40 ' loop through 40 spells
  3768.    Read b$, c$ ' read spell chant, spell name
  3769.    If userrec.spell(i) Then ' spells array element flag
  3770.      If i>20 Then ' place first 20 on left side of screen
  3771.        Locate i-17,5,0 ' position cursor
  3772.        Print b$; ' append spell name
  3773.      Else ' place second 20 on right side of screen
  3774.        Locate i+3,45,0 ' position cursor
  3775.        Print b$; ' append spell name
  3776.      Endif
  3777.    Endif
  3778.  Next ' get next spell
  3779.  Gosub Key.Press ' wait
  3780.  Gosub Restore.Screen ' redraw dungeon screen
  3781.  Return ' exit routine
  3782.  
  3783. ' display screen of players inventory
  3784. Inventory:
  3785.  Gosub Store.Dungeon.Level ' store dungeon screen
  3786.  Color 14, 1 ' blue background
  3787.  Cls ' clear screen
  3788.  ' make inventory display screen
  3789.  Color 15 ' ansi color
  3790.  Locate 1,15,0 ' position cursor
  3791.  Print "Your player has collected the following items:";
  3792.  ' display wands and potions on left side of screen
  3793.  Color 10 ' ansi color
  3794.  Locate 2,5,0 ' position cursor
  3795.  Print "Key: Alt-"; ' display key command for wands
  3796.  Locate 2,45,0 ' position cursor
  3797.  Print "Key: Alt-"; ' display key command for potions
  3798.  Color 14 ' ansi color
  3799.  Restore Wand.Data ' restore data pointer to wand data
  3800.  For i=1 To 10 ' loop through 10 wands
  3801.    Read b$, x ' read wand name, wand spell number
  3802.    If userrec.wand(i) Then ' check wands array element flag
  3803.      Locate i+2,5,0 ' position cursor
  3804.      Print "("+Chr$(i+64)+")wand of "+b$; ' append wand name
  3805.    Endif
  3806.  Next
  3807.  Restore Potion.Data ' restore data pointer to potion data
  3808.  For i=1 To 10 ' loop through 10 potions
  3809.    Read b$, x ' read potion name, spell number
  3810.    If userrec.potion(i) Then ' check potions array element flag
  3811.      Locate i+2,45,0 ' position cursor
  3812.      Print "("+Chr$(i+80)+")potion of "+b$; ' append potion name
  3813.    Endif
  3814.  Next
  3815.  Color 10 ' ansi color
  3816.  Locate 14,5,0 ' position cursor
  3817.  Print "Key: Control-"; ' display key command for staffs
  3818.  Locate 14,45,0 ' position cursor
  3819.  Print "Key: Control-"; ' display key command for rings
  3820.  Color 14 ' ansi color
  3821.  Restore Staff.Data ' restore data pointer to staff data
  3822.  For i=1 To 10 ' loop through 10 staffs
  3823.    Read b$, x ' read staff name, staff spell number
  3824.    If userrec.staff(i) Then ' check staff array element flag
  3825.      Locate i+14,5 ' position cursor
  3826.      Print "("+Chr$(i+64)+")staff of "+b$; ' append staff name
  3827.    Endif
  3828.  Next
  3829.  Restore Ring.Data ' restore data pointer to ring data
  3830.  For i=1 To 10 ' loop through 10 rings
  3831.    Read b$, x ' read ring name, ring spell number
  3832.    If userrec.ring(i) Then ' check ring array element flag
  3833.      Locate i+14,45,0 ' position cursor
  3834.      Print "("+Chr$(i+80)+")ring of "+b$; ' append ring name
  3835.    Endif
  3836.  Next
  3837.  Gosub Key.Press ' wait
  3838.  Gosub Restore.Screen ' redraw dungeon screen
  3839.  Return ' exit routine
  3840.  
  3841. ' open the user file, length of user record
  3842. Open.User.File:
  3843.  Close 1 ' close file 1
  3844.  ' open user file random
  3845.  Open "players.dat" For Random Shared As #1 Len=Len(userrec)
  3846.  Return ' exit routine
  3847.  
  3848. ' open the data file, length of dungeon record
  3849. Open.Data.File:
  3850.  Close 2 ' close file 2
  3851.  ' name the data file to store the dungeon statistics,
  3852.  ' the extension being the users index padded in zeroes
  3853.  filename$="datafile."+Right$(Str$(ux+1000),3)
  3854.  ' open the file, randomly, length of the record equal to
  3855.  ' the record structure containing the dungeon level data
  3856.  Open filename$ For Random Shared As #2 Len=Len(dungeonrec)
  3857.  Return ' exit routine
  3858.  
  3859. ' store user record and data to user file, at user record number
  3860. Put.User.File:
  3861.  userrec.codename=fnencrypt$(code$) ' store encrypted codename in user record
  3862.  userrec.password=fnencrypt$(pass$) ' store encrypted password in user record
  3863.  Put 1,ux,userrec ' put user record into user index number
  3864.  Return ' exit routine
  3865.  
  3866. ' create new dungeon level
  3867. Make.Dungeon:
  3868.  Color 14, 1 ' blue background
  3869.  Cls ' clear screen
  3870.  Color 13 ' ansi color
  3871.  Locate 12,27,0 ' position cursor
  3872.  Print "Creating Dungeon Level"; ' display dungeon level being created
  3873.  Print Str$(dlvl#); ' dungeon level
  3874.  Color 7 ' ansi color
  3875.  Gosub Pause.Second ' wait
  3876.  Gosub Pause.Second ' wait
  3877.  Gosub Pause.Second ' wait
  3878.  ll=1 ' reset extended cell display amount
  3879.  llc=0 ' reset extended cell display counter
  3880.  For i=0 To 26 ' clear temporary dungeon arrays
  3881.    For j=0 To 11
  3882.      w(i,j)=0
  3883.      v(i,j)=0
  3884.    Next
  3885.  Next
  3886.  ' reset temporary dungeon creation counters
  3887.  q=0
  3888.  z=0
  3889.  x=Int(Rnd*26+1)
  3890.  c=1
  3891.  w(x,1)=c
  3892.  c=c+1
  3893.  r=x
  3894.  s=1
  3895.  ' following source code makes a maze in v, and w.
  3896.  ' probably cannot be restructured..
  3897.  Goto 2540
  3898.  2440 IF R<>26 Then 2520
  3899.  IF S<>11 Then 2490
  3900.  R=1
  3901.  S=1
  3902.  Goto 2530
  3903.  2490 R=1
  3904.  S=S+1
  3905.  Goto 2530
  3906.  2520 R=R+1
  3907.  2530 IF W(R,S)=0 Then 2440
  3908.  2540 IF R-1=0 Then 2830
  3909.  IF W(R-1,S) Then 2830
  3910.  IF S-1=0 Then 2680
  3911.  IF W(R,S-1) Then 2680
  3912.  IF R=26 Then 2610
  3913.  IF W(R+1,S) Then 2610
  3914.  X=INT(RND*3+1):ON X Goto 3140,3210,3280
  3915.  2610 IF S<>11 Then 2650
  3916.  IF Z=1 Then 2670
  3917.  Q=1
  3918.  Goto 2660
  3919.  2650 IF W(R,S+1) Then 2670
  3920.  2660 X=INT(RND*3+1):ON X Goto 3140,3210,3370
  3921.  2670 X=INT(RND*2+1):ON X Goto 3140,3210
  3922.  2680 IF R=26 Then 2770
  3923.  IF W(R+1,S) Then 2770
  3924.  IF S<>11 Then 2740
  3925.  IF Z=1 Then 2760
  3926.  Q=1
  3927.  Goto 2750
  3928.  2740 IF W(R,S+1) Then 2760
  3929.  2750 X=INT(RND*3+1):ON X Goto 3140,3280,3370
  3930.  2760 X=INT(RND*2+1):ON X Goto 3140,3280
  3931.  2770 IF S<>11 Then 2810
  3932.  IF Z=1 Then 3140
  3933.  Q=1
  3934.  Goto 2820
  3935.  2810 IF W(R,S+1) Then 3140
  3936.  2820 X=INT(RND*2+1):ON X Goto 3140,3370
  3937.  2830 IF S-1=0 Then 3000
  3938.  IF W(R,S-1) Then 3000
  3939.  IF R=26 Then 2940
  3940.  IF W(R+1,S) Then 2940
  3941.  IF S<>11 Then 2910
  3942.  IF Z=1 Then 2930
  3943.  Q=1
  3944.  Goto 2920
  3945.  2910 IF W(R,S+1) Then 2930
  3946.  2920 X=INT(RND*3+1):ON X Goto 3210,3280,3370
  3947.  2930 X=INT(RND*2+1):ON X Goto 3210,3280
  3948.  2940 IF S<>11 Then 2980
  3949.  IF Z=1 Then 3210
  3950.  Q=1
  3951.  Goto 2990
  3952.  2980 IF W(R,S+1) Then 3210
  3953.  2990 X=INT(RND*2+1):ON X Goto 3210,3370
  3954.  3000 IF R=26 Then 3080
  3955.  IF W(R+1,S) Then 3080
  3956.  IF S<>11 Then 3060
  3957.  IF Z=1 Then 3280
  3958.  Q=1
  3959.  Goto 3220
  3960.  3060 IF W(R,S+1) Then 3280
  3961.  X=INT(RND*2+1):ON X Goto 3280,3370
  3962.  3080 IF S<>11 Then 3120
  3963.  IF Z=1 Then 2440
  3964.  Q=1
  3965.  Goto 3370
  3966.  3120 IF W(R,S+1) Then 2440
  3967.  Goto 3370
  3968.  3140 W(R-1,S)=C
  3969.  C=C+1
  3970.  V(R-1,S)=2
  3971.  R=R-1
  3972.  IF C=287 Then 3570
  3973.  Q=0
  3974.  Goto 2540
  3975.  3210 W(R,S-1)=C
  3976.  3220 C=C+1
  3977.  V(R,S-1)=1
  3978.  S=S-1
  3979.  IF C=287 Then 3570
  3980.  Q=0
  3981.  Goto 2540
  3982.  3280 W(R+1,S)=C
  3983.  C=C+1
  3984.  IF V(R,S)=0 Then 3330
  3985.  V(R,S)=3
  3986.  Goto 3340
  3987.  3330 V(R,S)=2
  3988.  3340 R=R+1
  3989.  IF C=287 Then 3570
  3990.  Goto 2830
  3991.  3370 IF Q=1 Then 3470
  3992.  W(R,S+1)=C
  3993.  C=C+1
  3994.  IF V(R,S)=0 Then 3430
  3995.  V(R,S)=3
  3996.  Goto 3440
  3997.  3430 V(R,S)=1
  3998.  3440 S=S+1
  3999.  IF C=287 Then 3570
  4000.  Goto 2540
  4001.  3470 Z=1
  4002.  IF V(R,S)=0 Then 3520
  4003.  V(R,S)=3
  4004.  Q=0
  4005.  Goto 2440
  4006.  3520 V(R,S)=1
  4007.  Q=0
  4008.  R=1
  4009.  S=1
  4010.  Goto 2530
  4011. 3570
  4012.  ' maze maker ends here..
  4013.  For i=1 To 24 ' clear maze array
  4014.    For j=1 To 80
  4015.      dungeonrec.dat(i,j)=46 ' with dungeon dots
  4016.    Next
  4017.  Next
  4018.  For j=1 To 11 ' convert array to maze
  4019.    For i=1 To 26
  4020.      If v(i,j)<2 Then
  4021.        dungeonrec.dat(j*2,i*3-1)=46
  4022.        dungeonrec.dat(j*2,i*3)=46
  4023.        dungeonrec.dat(j*2,i*3+1)=176
  4024.      Else
  4025.        dungeonrec.dat(j*2,i*3-1)=46
  4026.        dungeonrec.dat(j*2,i*3)=46
  4027.        dungeonrec.dat(j*2,i*3+1)=46
  4028.      Endif
  4029.    Next
  4030.    For i=1 To 26
  4031.      If v(i,j)=0 Or v(i,j)=2 Then
  4032.        dungeonrec.dat(j*2+1,i*3-2)=176
  4033.        dungeonrec.dat(j*2+1,i*3-1)=176
  4034.        dungeonrec.dat(j*2+1,i*3)=176
  4035.      Else
  4036.        dungeonrec.dat(j*2+1,i*3-2)=176
  4037.        dungeonrec.dat(j*2+1,i*3-1)=46
  4038.        dungeonrec.dat(j*2+1,i*3)=46
  4039.      Endif
  4040.    Next
  4041.  Next
  4042.  For i=1 To 80 ' border
  4043.    dungeonrec.dat(1,i)=176
  4044.    dungeonrec.dat(23,i)=176
  4045.  Next
  4046.  For i=1 To 24 ' border
  4047.    dungeonrec.dat(i,1)=176
  4048.    dungeonrec.dat(i,79)=176
  4049.  Next
  4050.  ' dat() now contains borderlike dungeon/maze
  4051.  u1=0 ' set room total gold items counter
  4052.  u2=0 ' set room total coins items counter
  4053.  u3=0 ' set room total gems items counter
  4054.  For p=1 To 4 ' make four rooms
  4055.    Select Case p
  4056.    Case 1 ' first room
  4057.      m=Int(Rnd*6+2) ' room x-coordinate
  4058.      n=Int(Rnd*30+2) ' room y-coordinate in upper-left half of dungeon
  4059.    Case 2 ' second room
  4060.      m=Int(Rnd*6+2) ' room x=coordinate
  4061.      n=Int(Rnd*32+40) ' room y-coordinate in upper-right half of dungeon
  4062.    Case 3 ' third room
  4063.      m=Int(Rnd*10+8) ' room x=coordinate
  4064.      n=Int(Rnd*30+2) ' room y-coordinate in lower-left half of dungeon
  4065.    Case 4 ' fourth room
  4066.      m=Int(Rnd*10+8) ' room x=coordinate
  4067.      n=Int(Rnd*32+40) ' room y-coordinate in lower-right half of dungeon
  4068.    End Select
  4069.    x1=4 ' size of room side
  4070.    y1=6 ' size of room side
  4071.    For q1=0 To x1 ' make room border
  4072.      dungeonrec.dat(m+q1,n)=21+p ' specific border character
  4073.      dungeonrec.dat(m+q1,n+y1)=21+p ' specific border character
  4074.    Next
  4075.    For q1=0 To y1 ' make room border
  4076.      dungeonrec.dat(m,n+q1)=21+p ' specific border character
  4077.      dungeonrec.dat(m+x1,n+q1)=21+p ' specific border character
  4078.    Next
  4079.    Select Case Int(Rnd*3+1) ' select item to fill room
  4080.    Case 1 ' gold
  4081.      t=36 ' gold symbol
  4082.      u1=u1+15 ' total room gold added
  4083.    Case 2 ' coins
  4084.      t=38 ' coins symbol
  4085.      u2=u2+15 ' total room coins added
  4086.    Case 3 ' gems
  4087.      t=42 ' gems symbol
  4088.      u3=u3+15 ' total room gems added
  4089.    End Select ' end select item
  4090.    For q1=m+1 To m+x1-1 ' loop through inside of room
  4091.      For q2=n+1 To n+y1-1 ' loop through inside of room
  4092.        dungeonrec.dat(q1,q2)=t
  4093.      Next ' end room contents loop
  4094.    Next ' end room contents loop
  4095.  Next ' end make rooms
  4096.  Do ' loop until dungeon dot found
  4097.    m=Int(Rnd*20+2)
  4098.    n=Int(Rnd*76+2)
  4099.  Loop Until dungeonrec.dat(m,n)=46
  4100.  dungeonrec.dat(m,n)=62 ' staircase up ('>')
  4101.  Do ' loop until dungeon dot found
  4102.    m=Int(Rnd*20+2)
  4103.    n=Int(Rnd*76+2)
  4104.  Loop Until dungeonrec.dat(m,n)=46
  4105.  dungeonrec.dat(m,n)=60 ' staircase down ('<')
  4106.  Color 14, 1 ' blue background
  4107.  Cls ' clear screen
  4108.  Color 13 ' ansi color
  4109.  Locate 12,25,0 ' position cursor
  4110.  Print "Replenishing Dungeon Level"; ' make message
  4111.  Print Str$(dlvl#); ' dungeon level being replenished
  4112.  Color 7 ' ansi color
  4113.  Gosub Pause.Second ' wait
  4114.  Gosub Pause.Second ' wait
  4115.  Gosub Pause.Second ' wait
  4116.  Gosub Replenish.Dungeon ' add dungeon symbols/characters
  4117.  Color 14, 1 ' blue background
  4118.  Cls ' clear screen
  4119.  Do ' loop until dungeon dot found
  4120.    xco=Int(Rnd*20+2) ' select player x-coordinate
  4121.    yco=Int(Rnd*76+2) ' select player y-coordinate
  4122.  Loop Until dungeonrec.dat(xco,yco)=46 ' loop until dungeon dot found
  4123.  u1=0 ' reset room total gold in rooms
  4124.  u2=0 ' reset room total coins in rooms
  4125.  u3=0 ' reset room total gems in rooms
  4126.  Return ' exit routine
  4127.  
  4128. ' reset any dungeon symbols/characters to dungeon dot,
  4129. ' except for stairs up/down
  4130. Zero.Dungeon:
  4131.  For i=1 to 24 ' loop through z-maze
  4132.    For j=1 to 80
  4133.      Select Case dungeonrec.dat(i,j) ' find symbol
  4134.      Case 35, 126, 94, 36, 111, 33, 63, 42, 38, 254, 124, 64, 37, 34
  4135.        dungeonrec.dat(i,j)=46 ' reset to dungeon dot
  4136.      End Select
  4137.    Next
  4138.  Next
  4139.  Return ' exit routine
  4140.  
  4141. ' calculate price of entire dungeon
  4142. ' add number of dungeon symbols/characters,
  4143. ' except for stairs up/down
  4144. Dungeon.Worth:
  4145.  k=0 ' counter
  4146.  For i=1 to 24 ' loop through z-maze
  4147.    For j=1 to 80
  4148.      Select Case dungeonrec.dat(i,j) ' select symbol
  4149.      Case 35, 126, 94, 36, 111, 33, 63, 42, 38, 254, 124, 64, 37, 34
  4150.        k=k+1 ' increment counter
  4151.      End Select
  4152.    Next
  4153.  Next
  4154.  ' calculate price according to random values and counter
  4155.  temp#=(Rnd*dlvl#*2+1)*userrec.stats1(2)^2/2
  4156.  temp#=temp#+dlvl#*2+Rnd*userrec.stats1(2)*50
  4157.  temp#=temp#*k
  4158.  userrec.stats1(5)=userrec.stats1(5)+Int(temp#)
  4159.  Return ' exit routine
  4160.  
  4161. ' restore dungeon with new symbols/characters
  4162. Replenish.Dungeon:
  4163.  dungeonrec.stats(4)=0 ' all level counters
  4164.  dungeonrec.stats(6)=0 ' number of monster
  4165.  dungeonrec.stats(5)=0 ' all monsters dead flag
  4166.  For i=1 To Int(Rnd*10+10) ' random loop number
  4167.    Do ' loop until dungeon dot found
  4168.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4169.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4170.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate is empty
  4171.    dungeonrec.dat(m,n)=35 ' make cell monster symbol
  4172.    dungeonrec.stats(6)=dungeonrec.stats(6)+1 ' increment number of monsters
  4173.  Next ' loop through
  4174.  dungeonrec.stats(7)=0 ' number of scrolls
  4175.  dungeonrec.stats(8)=0 ' all scrolls found flag
  4176.  For i=1 To Int(Rnd*10+5) ' random loop number
  4177.    Do ' loop until dungeon dot found
  4178.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4179.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4180.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate is empty
  4181.    dungeonrec.dat(m,n)=126 ' make cell scroll symbol
  4182.    dungeonrec.stats(7)=dungeonrec.stats(7)+1 ' increment number of scrolls
  4183.  Next ' loop through
  4184.  dungeonrec.stats(9)=0 'number of traps
  4185.  dungeonrec.stats(10)=0 ' all traps found flag
  4186.  For i=1 To Int(Rnd*10+5) ' random loop number
  4187.    Do ' loop until dungeon dot found
  4188.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4189.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4190.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4191.    dungeonrec.dat(m,n)=94 ' make cell trap symbol
  4192.    dungeonrec.stats(9)=dungeonrec.stats(9)+1 ' increment number of traps
  4193.  Next ' loop through
  4194.  dungeonrec.stats(11)=u1 ' number of gold
  4195.  dungeonrec.stats(12)=0 ' all gold found flag
  4196.  For i=1 To Int(Rnd*10+10) ' random loop number
  4197.    Do ' loop until dungeon dot found
  4198.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4199.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4200.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4201.    dungeonrec.dat(m,n)=36 ' make cell gold symbol
  4202.    dungeonrec.stats(11)=dungeonrec.stats(11)+1 ' increment number of gold
  4203.  Next ' loop through
  4204.  dungeonrec.stats(13)=0 ' number of pits
  4205.  dungeonrec.stats(14)=0 ' all pits found flag
  4206.  For i=1 To Int(Rnd*10+5) ' random loop number
  4207.    Do ' loop until dungeon dot found
  4208.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4209.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4210.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4211.    dungeonrec.dat(m,n)=111 ' make cell pit symbol
  4212.    dungeonrec.stats(13)=dungeonrec.stats(13)+1 ' increment number of pits
  4213.  Next ' loop through
  4214.  dungeonrec.stats(15)=0 ' number of teleporters
  4215.  dungeonrec.stats(16)=0 ' all teleporters found flag
  4216.  For i=1 To Int(Rnd*5+5) ' random loop number
  4217.    Do ' loop until dungeon dot found
  4218.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4219.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4220.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4221.    dungeonrec.dat(m,n)=33 ' make cell teleporter symbol
  4222.    dungeonrec.stats(15)=dungeonrec.stats(15)+1 ' increment number of teleporters
  4223.  Next ' loop through
  4224.  dungeonrec.stats(17)=0 ' number of temples
  4225.  dungeonrec.stats(18)=0 ' all temples found flag
  4226.  For i=1 To Int(Rnd*5+5) ' random loop number
  4227.    Do ' loop until dungeon dot found
  4228.      m=Int(Rnd*20+2) ' calculate x-coodirnate
  4229.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4230.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4231.    dungeonrec.dat(m,n)=63 ' make cell temple symbol
  4232.    dungeonrec.stats(17)=dungeonrec.stats(17)+1 ' increment number of temples
  4233.  Next ' loop through
  4234.  dungeonrec.stats(19)=u3 ' number gems
  4235.  dungeonrec.stats(20)=0 ' all gems found flag
  4236.  For i=1 To Int(Rnd*10+5) ' random loop number
  4237.    Do ' loop until dungeon dot found
  4238.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4239.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4240.    Loop Until dungeonrec.dat(m,n)=46' xy-coordinate empty
  4241.    dungeonrec.dat(m,n)=42 ' make cell gem symbol
  4242.    dungeonrec.stats(19)=dungeonrec.stats(19)+1 ' increment number of gems
  4243.  Next ' loop through
  4244.  dungeonrec.stats(21)=u2 ' number of coins
  4245.  dungeonrec.stats(22)=0 ' all coins found flag
  4246.  For i=1 To Int(Rnd*10+5) ' random loop number
  4247.    Do ' loop until dungeon dot found
  4248.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4249.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4250.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4251.    dungeonrec.dat(m,n)=38 ' make cell coins symbol
  4252.    dungeonrec.stats(21)=dungeonrec.stats(21)+1 ' increment number of coins
  4253.  Next ' loop through
  4254.  dungeonrec.stats(23)=0 ' number of chests
  4255.  dungeonrec.stats(24)=0 ' all chests found flag
  4256.  For i=1 To Int(Rnd*10+5) ' random loop number
  4257.    Do ' loop until dungeon dot found
  4258.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4259.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4260.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4261.    dungeonrec.dat(m,n)=254 ' make cell chest symbol
  4262.    dungeonrec.stats(23)=dungeonrec.stats(23)+1 ' increment number of chests
  4263.  Next ' loop through
  4264.  dungeonrec.stats(25)=0 ' number of wands
  4265.  dungeonrec.stats(26)=0 ' all wands found flag
  4266.  For i=1 To Int(Rnd*5+2) ' random loop number
  4267.    Do ' loop until dungeon dot found
  4268.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4269.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4270.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4271.    dungeonrec.dat(m,n)=124 ' make cell wand symbol
  4272.    dungeonrec.stats(25)=dungeonrec.stats(25)+1 ' increment number of wands
  4273.  Next ' loop through
  4274.  dungeonrec.stats(27)=0 ' number of potions
  4275.  dungeonrec.stats(28)=0 ' all potions found flag
  4276.  For i=1 To Int(Rnd*5+2) ' random loop number
  4277.    Do ' loop until dungeon dot found
  4278.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4279.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4280.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4281.    dungeonrec.dat(m,n)=64 ' make cell potion symbol
  4282.    dungeonrec.stats(27)=dungeonrec.stats(27)+1 ' increment number of potions
  4283.  Next ' loop through
  4284.  dungeonrec.stats(29)=0 ' number of staffs
  4285.  dungeonrec.stats(30)=0 ' all staffs found flag
  4286.  For i=1 To Int(Rnd*5+2) ' random loop number
  4287.    Do ' loop until dungeon dotfound
  4288.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4289.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4290.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4291.    dungeonrec.dat(m,n)=37 ' make cell staff symbol
  4292.    dungeonrec.stats(29)=dungeonrec.stats(29)+1 ' increment number of staffs
  4293.  Next ' loop through
  4294.  dungeonrec.stats(31)=0 ' number of rings
  4295.  dungeonrec.stats(32)=0 ' all rings found flag
  4296.  For i=1 To Int(Rnd*5+2) ' random loop number
  4297.    Do ' loop until dungeon dot found
  4298.      m=Int(Rnd*20+2) ' calculate x-coordinate
  4299.      n=Int(Rnd*76+2) ' calculate y-coordinate
  4300.    Loop Until dungeonrec.dat(m,n)=46 ' xy-coordinate empty
  4301.    dungeonrec.dat(m,n)=34 ' make cell ring symbol
  4302.    dungeonrec.stats(31)=dungeonrec.stats(31)+1 ' increment number of rings
  4303.  Next ' loop through
  4304.  Return ' exit routine
  4305.  
  4306. ' compute nearby cell activity
  4307. Cell.Action:
  4308.  Gosub Display.Cells ' display cells around player
  4309.  Gosub Monster.Attack ' monsters attack player
  4310.  Gosub Move.Monsters ' monsters move nearer to player
  4311.  Gosub Encounter.Cells ' nearby cells repopulated with monster symbols
  4312.  Return ' exit routine
  4313.  
  4314. ' display dungeon cells surrouding the players X characters,
  4315. ' ll being the length of area displayed around player
  4316. Display.Cells:
  4317.  Color 7 ' calculate boundaries
  4318.  x1=xco-ll ' calculate area of surrounding cells to display
  4319.  While x1<1 ' keep loop counter in bounds
  4320.    x1=x1+1 ' increment x1 loop counter
  4321.  Wend ' end loop bounds counter
  4322.  y1=yco-ll ' calculate area of surrounding cells to display
  4323.  While y1<1 ' keep loop counter in bounds
  4324.    y1=y1+1 ' increment y1 loop counter
  4325.  Wend ' end loop bounds counter
  4326.  x2=xco+ll ' calculate area of syrrounding cells to display
  4327.  While x2>23 ' keep loop counter in bounds
  4328.    x2=x2-1 ' decrement x2 loop counter
  4329.  Wend ' end loop bounds counter
  4330.  y2=yco+ll ' calculate area of surrounding cells to display
  4331.  While y2>79 ' keep loop counter in bounds
  4332.    y2=y2-1 ' decrment y2 loop counter
  4333.  Wend ' end loop bounds counter
  4334.  uf=0 ' xy coordinate room display flag
  4335.  For i=x1 To x2 ' loop surrounding players xy-coordinate
  4336.    For j=y1 To y2 ' surrounding y-coordinate
  4337.      Locate i,j,0 ' locate at xy cell display
  4338.      t=dungeonrec.dat(i,j) ' get symbol at xy in maze
  4339.      u=t ' store xy maze symbol
  4340.      If t=94 Or t=111 Then ' traps/pits
  4341.        t=46 ' display dungeon dot
  4342.      Endif
  4343.      If i=xco And j=yco Then ' xy is the players X character
  4344.        If t<>176 Then ' and is not a dungeon wall
  4345.          t=88 ' display an X
  4346.        Endif
  4347.      Endif
  4348.      If t=46 Or t=176 Then ' xy is dungeon dot/wall
  4349.        Color 7 ' color white
  4350.      Else ' otherwise
  4351.        Color 15 ' color highlight white
  4352.      Endif
  4353.      If u>21 And u<26 Then ' xy is room border
  4354.        If uf=0 Then ' room has been displayed
  4355.           uf=-1
  4356.           Gosub Display.Dungeon.Room ' display entire room
  4357.        Endif
  4358.      Else
  4359.        Print Chr$(t); ' display dungeon square symbol
  4360.      Endif
  4361.    Next ' loop all nearby cells
  4362.  Next
  4363.  Color 7 ' ansi color
  4364.  Return ' exit routine
  4365.  
  4366.  ' display entire room next to room border character
  4367. Display.Dungeon.Room: ' dungeonrec.dat(i,j) is character 22 (room border)
  4368.  rx=i ' room border counter
  4369.  ry=j ' room border counter
  4370.  For q1=rx-4 To rx+4 ' loop any xy-coordinates around room
  4371.    For q2=ry-6 To ry+6 ' loop any xy-coordinates around room
  4372.      If q1>1 And q1<23 Then ' check array bounds
  4373.        If q2>1 And q2<79 Then ' check array bounds
  4374.          If dungeonrec.dat(q1,q2)=t Then ' xy-coordinate is room border
  4375.            Locate q1,q2,0 ' locate at room border
  4376.            Print Chr$(176); ' display room border
  4377.          Endif
  4378.        Endif
  4379.      Endif
  4380.    Next
  4381.  Next
  4382.  Return ' exit routine
  4383.  
  4384. ' monsters attack the player
  4385. Monster.Attack:
  4386.  If slp=1 Then ' sleep flag
  4387.    Return ' exit routine
  4388.  Endif
  4389.  For mn=1 To 8 ' loop through monster array
  4390.    mxco=monsters(mn,1) ' get monster x-coordinate
  4391.    myco=monsters(mn,2) ' get monster y-coordinate
  4392.    If mxco Or myco Then
  4393.      x=Abs(xco-mxco) ' calculate distance from players xy
  4394.      y=Abs(yco-myco)
  4395.      If (x+y)=1 Or (x=1 And y=1) Then ' distance one square from player
  4396.        ' calculate monsters hits on player
  4397.        x=0 ' calculate shield
  4398.        For i=8 To 11
  4399.          x=x+userrec.stats2(i)
  4400.        Next
  4401.        x=x+shp+1
  4402.        mhp#=Int(Rnd*(monsters(mn,4)/x)+monsters(mn,3)-mhpm)
  4403.        ' display hits on player
  4404.        Color 14 ' ansi color
  4405.        a$="The "+monstername(monsters(mn,6))+" attacks you! "
  4406.        If mhp#<=0 Then ' monster missed
  4407.          a$=a$+"It missed!" ' make display message
  4408.          Gosub Display.Message ' output message
  4409.        Else
  4410.          Gosub Hit.Player ' hit player for monsters hit attack points
  4411.          If dlvl#=0 Then ' player died
  4412.            login=0 ' player leaves dungeon
  4413.            Return ' exit routine
  4414.          Endif
  4415.        Endif
  4416.      Endif
  4417.    Endif
  4418.  Next
  4419.  Return ' exit routine
  4420.  
  4421. ' move monster symbols one cell nearer player
  4422. Move.Monsters:
  4423.  If pw=1 Then ' pass monsters flag
  4424.    Return ' exit routine
  4425.  Endif
  4426.  For mn=1 To 8 ' loop through monsters
  4427.    mxco=monsters(mn,1) ' get monster x-coordinate
  4428.    myco=monsters(mn,2) ' get monster y-coordinate
  4429.    If mxco Or myco Then ' active monster xy-coordinates
  4430.      ' get distance to monster from players xy,
  4431.      ' standard hypotenuse formula for right angle.
  4432.      di=Int(Sqr((mxco-xco)^2+(myco-yco)^2))
  4433.      Select Case di
  4434.      Case 1 ' monster next to player
  4435.        If monsters(mn,4)<=10 Then ' monster is weak
  4436.          Gosub Monster.Evade
  4437.        Endif
  4438.      Case 2 ' monster is two squares away
  4439.        ' move monster closer
  4440.        u=Sgn(xco-mxco) ' store monsters xy-coordinates
  4441.        v=Sgn(yco-myco) ' distance one square from player
  4442.        ' recalculated monsters xy-coordinates can move to empty cell
  4443.        If dungeonrec.dat(mxco+u,myco+v)=46 Then
  4444.          Color 7 ' ansi color
  4445.          Locate mxco,myco,0 ' position cursor
  4446.          Print "."; ' clear monster with dungeon dot
  4447.          ' reset old dungeon array cell to dungeon dot
  4448.          dungeonrec.dat(mxco,myco)=46
  4449.          Color 15 ' ansi color
  4450.          mxco=mxco+u ' increment monster array x-coordinate
  4451.          myco=myco+v ' increment monster array y-coordinate
  4452.          Locate mxco,myco,0 ' position cursor
  4453.          Print "#"; ' and display monster symbol closer
  4454.          monsters(mn,1)=mxco ' reset monster array x-coordinate
  4455.          monsters(mn,2)=myco ' reset monster array y-coordinate
  4456.          ' reset new dungeon array cell to monster symbol
  4457.          dungeonrec.dat(mxco,myco)=35
  4458.        Endif
  4459.      Case Else ' beyond player square range
  4460.        monsters(mn,1)=0 ' set monsters xy-coordinates to zero
  4461.        monsters(mn,2)=0
  4462.      End Select
  4463.    Endif
  4464.  Next
  4465.  Return ' exit routine
  4466.  
  4467. ' monster evades player
  4468. Monster.Evade:
  4469.  Color 7 ' ansi color
  4470.  Locate mxco,myco,0 ' position cursor
  4471.  Print "."; ' clear monster with dungeon dot
  4472.  ' reset old dungeon array cell to dungeon dot
  4473.  dungeonrec.dat(mxco,myco)=46
  4474.  Do ' loop until empty cell to move monster
  4475.    For k=1 To Int(Rnd*2+2) ' random number of moves
  4476.      c=0 ' loop counter
  4477.      Do ' loop until empty nearby cell for demon
  4478.        c=c+1 ' increment loop counter
  4479.        If c>10 Then ' avoid infinite loop
  4480.          Exit For ' exit more than ten loops
  4481.        Endif
  4482.        cxco=mxco ' store x-coordinate
  4483.        cyco=myco ' store y-coordinate
  4484.        Gosub Get.Random.Direction ' get valid random direction
  4485.        If Coor.Direction Then ' returned valid random direction
  4486.          If dungeonrec.dat(mxco+xo,myco+yo)=46 Then ' empty dungeon cell
  4487.            Exit Do ' found empty cell at random direction
  4488.          Endif
  4489.        Endif
  4490.      Loop
  4491.      mxco=mxco+xo ' increment monster x coordinate
  4492.      myco=myco+yo ' increment monster y coordinate
  4493.    Next ' get next move
  4494.    If dungeonrec.dat(xco,yco)=46 Then ' move to an dungeon dot
  4495.      Exit Do ' end move monster
  4496.    Endif
  4497.  Loop
  4498.  ' available empty cell evade,
  4499.  Color 15 ' ansi color
  4500.  Locate mxco,myco,0 ' position cursor
  4501.  Print "#"; ' and display monster symbol closer
  4502.  ' set dungeon array monster xy to monster symbol
  4503.  monsters(mn,1)=mxco ' reset monster array x-coordinate
  4504.  monsters(mn,2)=myco ' reset monster array y-coordinate
  4505.  ' reset new dungeon array cell to monster symbol
  4506.  dungeonrec.dat(mxco,myco)=35
  4507.  Return ' exit routine
  4508.  
  4509. ' get any monsters nearby players dungeon cell
  4510. Encounter.Cells:
  4511.  x1=xco-ll ' calculate area of surrounding cells
  4512.  While x1<1 ' compare bounds
  4513.    x1=x1+1 ' increment coordinate
  4514.  Wend
  4515.  y1=yco-ll ' calculate area of surrounding cells
  4516.  While y1<1 ' compare bounds
  4517.    y1=y1+1 ' increment coordinate
  4518.  Wend
  4519.  x2=xco+ll ' calculate area of surrounding cells
  4520.  While x2>23 ' compare bounds
  4521.    x2=x2-1 ' decrement coordinate
  4522.  Wend
  4523.  y2=yco+ll ' calculate area of surrounding cells
  4524.  While y2>79 ' compare bounds
  4525.    y2=y2-1 ' decrement coordinate
  4526.  Wend
  4527.  For mxco=x1 To x2 ' distance of cell display amount
  4528.    For myco=y1 To y2 ' surrounding player
  4529.      If dungeonrec.dat(mxco,myco)=35 Then ' dungeon contains monster at xy
  4530.        mn=Int(Rnd*100+1) ' select random monster name
  4531.        Gosub Encounter.Monster ' get monster statistics
  4532.      Endif
  4533.    Next
  4534.  Next ' loop through all cells
  4535.  Return ' exit routine
  4536.  
  4537. ' puts monsters statistics in monster array,
  4538. ' dependent on monster at xy-coordinate in mxco,myco
  4539. Encounter.Monster:
  4540.  ' verify monster does not already exist in monster array
  4541.  For w=1 To 8 ' loop through monster xy array
  4542.    If monsters(w,1)=mxco And monsters(w,2)=myco Then ' monster at xy already
  4543.      Return ' exit routine
  4544.    Endif
  4545.  Next
  4546.  ' find empty monster array xy-coordinates
  4547.  For w=1 To 8 ' loop through monster xy array
  4548.    If monsters(w,1)=0 And monsters(w,2)=0 Then ' empty monster xy array found
  4549.      bonus=0
  4550.      If mn=101 Then ' monster selection is demon
  4551.        bonus=5
  4552.      Endif
  4553.      mlvl#=Int(Rnd*(dlvl#+bonus)+(dlvl#+bonus)/2+1) ' calculate monster level
  4554.      ' calculate monsters hit points by random values
  4555.      hp#=Int((Rnd*dlvl#*2+1)*mlvl#^2/2+dlvl#*2+Rnd*mlvl#*50)
  4556.      ' calculate monsters experience by random values
  4557.      ex#=Int(hp#/mlvl#)*Int(dlvl#/2+1)+Int(Rnd*hp#)
  4558.      monsters(w,1)=mxco ' store monster x-coordinate
  4559.      monsters(w,2)=myco ' store monster y-coordinate
  4560.      monsters(w,3)=mlvl# ' store monster level
  4561.      monsters(w,4)=hp# ' store monster hit points
  4562.      monsters(w,5)=ex# ' store monster experience
  4563.      monsters(w,6)=mn ' store monster number
  4564.      Exit For ' exit loop
  4565.    Endif
  4566.  Next
  4567.  Return ' exit routine
  4568.  
  4569. ' hits player for points in mhp#
  4570. Hit.Player:
  4571.  Color 14 ' ansi color
  4572.  If mhp#=0 Then ' calculate hits on player if mhp# is zero
  4573.    mhp#=Int(Rnd*dlvl#*10+1)-userrec.stats2(2) ' calculate hits
  4574.    If mhp#<=0 Then ' zero or less hits
  4575.      Gosub Display.Message ' output prepared message
  4576.      Gosub Pause.Second ' wait
  4577.      Return ' exit routine
  4578.    Endif
  4579.  Endif
  4580.  ' precalculated hits on player, mhp#
  4581.  a$="It hit you for"+Str$(mhp#)+" hits!" ' make display message
  4582.  Gosub Display.Message ' output message
  4583.  Gosub Pause.Second ' wait
  4584.  ' decrease players current hits remaining by mhp# points
  4585.  userrec.stats1(4)=userrec.stats1(4)-mhp#
  4586.  If userrec.stats1(4)>0 Then ' players hits less than zero
  4587.    Return ' exit routine
  4588.  Endif
  4589.  ' player loses a level
  4590.  ' decrement players maximum hits to lower level
  4591.  userrec.stats1(6)=userrec.stats1(6)-userrec.stats2(4)
  4592.  If userrec.stats1(6)<15 Then ' compute minimum players max hits variable
  4593.     userrec.stats1(6)=15 ' reset to 15, the minimum
  4594.  Endif
  4595.  userrec.stats1(4)=userrec.stats1(6) ' reset current hits to lower max hits
  4596.  userrec.stats1(2)=userrec.stats1(2)-1 ' decrement players level by one
  4597.  ' recalculate experience needed for next level
  4598.  x#=userrec.stats1(2)+5
  4599.  y#=2^x#
  4600.  userrec.stats1(3)=y#
  4601.  If userrec.stats1(2)>0 Then ' players level is zero
  4602.    Return ' exit routine
  4603.  Endif
  4604.  ' player died
  4605.  userrec.stats1(2)=1 ' reset player to level one
  4606.  userrec.stats1(4)=15 ' reset players hits
  4607.  userrec.stats1(6)=15 ' reset players maximum hits
  4608.  ' make player died message prompt
  4609.  Color 31 ' ansi color
  4610.  a$="You died!(press 5 to exit the dungeon)"
  4611.  Gosub Display.Message
  4612.  Do ' get a keystroke
  4613.    Gosub Get.Keystroke
  4614.  Loop Until x=5
  4615.  ' presses enter/5 to exit
  4616.  Color 7 ' ansi color
  4617.  Gosub Store.Dungeon.Level ' store dungeon array/screen
  4618.  ' player exits to dungeon level zero, main input loop exits when zero.
  4619.  dlvl#=0
  4620.  x=userrec.stats1(2)*10 ' reset players spell points
  4621.  userrec.stats2(13)=x
  4622.  userrec.stats2(14)=x
  4623.  userrec.stats2(15)=x
  4624.  userrec.stats2(16)=x
  4625.  Return ' exit routine
  4626.  
  4627.  ' global error routine
  4628. Error.Routine:
  4629.  Beep:Beep:Beep ' alert sound
  4630.  Resume Error.Trap ' resume to error exit routine
  4631.  
  4632.  ' error exit routine
  4633. Error.Trap:
  4634.  Color 7,0 ' reset ansi
  4635.  Cls ' clear screen
  4636.  Locate 10,10 ' locate message
  4637.  Print "The Dungeon Crashed! (Error:"+Str$(Err)+")" ' print message
  4638.  End ' end program
  4639.  
  4640. ' four levels of spell chants and names
  4641. Spell.Data:
  4642.  Data "i cleanse thy body","heal"
  4643.  Data "i protect thee","protection"
  4644.  Data "darts fly from my hands","magic missile"
  4645.  Data "i shield thee","shield"
  4646.  Data "i strengthen thee","strength"
  4647.  Data "your eyes shut tight","sleep"
  4648.  Data "objects become visible","locate"
  4649.  Data "flames fly from my fingertips","pyrotechnics"
  4650.  Data "i call upon winds of fire","firestorm"
  4651.  Data "i create gold from air","transmute"
  4652.  
  4653.  Data "i restore thee","restoration"
  4654.  Data "fright causes you to falter","scare"
  4655.  Data "balls of fire engulf you","fireball"
  4656.  Data "it becomes hard to see","obscurement"
  4657.  Data "a shield for my body","power shield"
  4658.  Data "i will a wall","wall of will"
  4659.  Data "i must see","light"
  4660.  Data "gravity leaves","levitate"
  4661.  Data "rise from the dead","monster summon"
  4662.  Data "i point and you die","finger of death"
  4663.  
  4664.  Data "i regenerate thee","regeneration"
  4665.  Data "you must not remember","forget"
  4666.  Data "a bolt from hell carries thee away","lightning bolt"
  4667.  Data "multicolored shield protect me","phantasmal force"
  4668.  Data "i create a wall","wall of force"
  4669.  Data "i cast sleep unto your eyes","charm monster"
  4670.  Data "i will see more","continual light"
  4671.  Data "i will travel through thee","passwall"
  4672.  Data "monsters of hell hear me","demon summon"
  4673.  Data "you will all die","doomkill"
  4674.  
  4675.  Data "i resurrect thee","resurrection"
  4676.  Data "i frighten thee","fear"
  4677.  Data "you turn to dust","disintegrate"
  4678.  Data "swirling swords slice you","blade barrier"
  4679.  Data "may my weapon become powerful","enchanted weapon"
  4680.  Data "you are binded tightly","hold monster"
  4681.  Data "i travel to parts unknown","teleport"
  4682.  Data "you become another","polymorph"
  4683.  Data "let me pass","time stop"
  4684.  Data "everything dies continuously","genocide"
  4685.  
  4686. ' ten wand spells, and spell number
  4687. Wand.Data:
  4688.  Data "magic missile",3,"pyrotechnics",8,"firestorm",9,"fireball",13
  4689.  Data "finger of death",20,"lightning bolt",23,"doomkill",30
  4690.  Data "disintegrate",33,"blade barrier",34,"genocide",40
  4691.  
  4692. ' ten potion spells, and spell number
  4693. Potion.Data:
  4694.  Data "heal",1,"protection",2,"shield",4,"strength",5
  4695.  Data "restoration",11,"power shield",15,"wall of will",16
  4696.  Data "regeneration",21,"phantasmal force",24,"resurrection",31
  4697.  
  4698. ' ten staff spells, and spell number
  4699. Staff.Data:
  4700.  Data "locate",7,"transmute",10,"light",17,"levitate",18
  4701.  Data "continual light",27,"passwall",28,"fear",32
  4702.  Data "enchanted weapon",35,"teleport",37,"time stop",39
  4703.  
  4704. ' ten ring spells, and spell number
  4705. Ring.Data:
  4706.  Data "sleep",6,"scare",12,"obscurement",14,"monster summon",19
  4707.  Data "forget",22,"wall of force",25,"charm monster",26
  4708.  Data "demon summon",29,"hold monster",36,"polymorph",38
  4709.  
  4710. ' 100 monster names
  4711. Monster.Data:
  4712.  Data algoid,ankheg,azer,baku,bandit,basilisk,bat,bear,beetle,beholder,bowler
  4713.  Data bugbear,bullywug,caterwaul,centipede,chimera,cloaker,cockatrice,corpse
  4714.  Data crawler,dao,demilich,diakk,drider,duergar,elf,firebat,frog,gargoyle
  4715.  Data ghast,ghost,giant,githyanki,gnoll,gnome,goblin,golem,grell,grimlock
  4716.  Data grue,hornet,horror,hulk,hydra,kenku,killer,kobold,lamprey,lich,lion
  4717.  Data lizard,mage,margoyle,meenlock,mephit,mimic,minotaur,mummy,norker,ogre
  4718.  Data orc,otyugh,owlbear,pech,pedipalp,phantom,phycomid,piercer,planetar
  4719.  Data quaggoth,rakshasa,rat,reptile,scorpion,shocker,skeleton,slaad,slime
  4720.  Data slug,snake,solifugid,spectator,spectre,spider,stalker,stirge,tarrasque
  4721.  Data thoquaa,toad,troglodyte,troll,ustilagor,vampire,verbeeg,vulching,weasel
  4722.  Data webbird,wight,wraith,wyvern,demon
  4723.